[Seasar-user:10302] Re: [DBFlute] 識別子が長すぎるを解決したい

Junichi Kato [E-MAIL ADDRESS DELETED]
2007年 9月 4日 (火) 20:03:23 JST


久保さん,
加藤です.

> 自動で短くなった部分のテーブルだけが取得できないでしょうか?
> (例えば、Alias名が短くなった関連テーブルが取れないとか
>          自己参照FKのものだけが取れないとか)
> 
> 何か具体的な現象を頂けたらありがたいです。(よろしくお願いします)

以下のようなコードで試しております.

AdministratorCB cb = new AdministratorCB();

cb.query().setAdministratorCode_Equal("ADMIN1");
cb.query().queryAdministratorConfigAsOne().setDisable_Equal_No();
cb.query().queryUserAccountByUserAccountId()
		.queryUserAccountConfigByUserAccountIdAsOne()
		.setAccountStatus_Equal_Active();

ListResultBean<Administrator> list = administratorBhv.selectList(cb);

System.out.println(list);

SELECT
    ADMINISTRATOR.ADMINISTRATOR_ID,
    ADMINISTRATOR.ADMINISTRATOR_CODE,
    ADMINISTRATOR.USER_ACCOUNT_ID,
    ADMINISTRATOR.TEST_TYPE,
    ADMINISTRATOR.CREATER_ID,
    ADMINISTRATOR.UPDATER_ID,
    ADMINISTRATOR.CREATE_DATE,
    ADMINISTRATOR.UPDATE_DATE
FROM
    ADMINISTRATOR left outer join ADMINISTRATOR_CONFIG AdministratorConfigAsOne on ADMINISTRATOR.ADMINISTRATOR_ID = AdministratorConfigAsOne.ADMINISTRATOR_ID left outer join USER_ACCOUNT UserAccountByUserAccountId on ADMINISTRATOR.USER_ACCOUNT_ID = UserAccountByUserAccountId.USER_ACCOUNT_ID left outer join USER_ACCOUNT_CONFIG dbfluteRelno4_n2 on UserAccountByUserAccountId.USER_ACCOUNT_ID = dbfluteRelno4_n2.USER_ACCOUNT_ID
WHERE
    ADMINISTRATOR.ADMINISTRATOR_CODE = 'ADMIN1' AND
    AdministratorConfigAsOne.DISABLE = 'N' AND
    dbfluteRelno4_n2.ACCOUNT_STATUS = 'A'

このSQL自体は,SQL plusから結果セットをちゃんと取得できますが
DBFluteのBhvからはなぜか取得できていません.

cb.query().setAdministratorCode_Equal("ADMIN1");
cb.query().queryAdministratorConfigAsOne().setDisable_Equal_No();

の条件だけですと,以下のようなSQLになります.

SELECT
    ADMINISTRATOR.ADMINISTRATOR_ID,
    ADMINISTRATOR.ADMINISTRATOR_CODE,
    ADMINISTRATOR.USER_ACCOUNT_ID,
    ADMINISTRATOR.TEST_TYPE,
    ADMINISTRATOR.CREATER_ID,
    ADMINISTRATOR.UPDATER_ID,
    ADMINISTRATOR.CREATE_DATE,
    ADMINISTRATOR.UPDATE_DATE
FROM
    ADMINISTRATOR left outer join ADMINISTRATOR_CONFIG AdministratorConfigAsOne on ADMINISTRATOR.ADMINISTRATOR_ID = AdministratorConfigAsOne.ADMINISTRATOR_ID
WHERE
    ADMINISTRATOR.ADMINISTRATOR_CODE = 'ADMIN1' AND
    AdministratorConfigAsOne.DISABLE = 'N'

この時は,Bhvからちゃんと結果セットはとれるのですが,

cb.query().queryUserAccountByUserAccountId()
		.queryUserAccountConfigByUserAccountIdAsOne()
		.setAccountStatus_Equal_Active();

を追加したとたんとれなくなります.
やはり,dbfluteRelno4_n2が関係してそうです.

> allcommon.cbean.sqlclause.AbstractSqlClause#isValidJoinAliasName()で、
>   return true; → return false;
> とすると、全てのAlias名がRELNOを使った短いものになります。
> 今は、OracleのSubClassで「aliasName.length() <= 30」としています。

return false; に変更して,

cb.query().setAdministratorCode_Equal("ADMIN1");
cb.query().queryAdministratorConfigAsOne().setDisable_Equal_No();

だけの条件でSQLを発行してみたのですが,

SELECT
    ADMINISTRATOR.ADMINISTRATOR_ID,
    ADMINISTRATOR.ADMINISTRATOR_CODE,
    ADMINISTRATOR.USER_ACCOUNT_ID,
    ADMINISTRATOR.TEST_TYPE,
    ADMINISTRATOR.CREATER_ID,
    ADMINISTRATOR.UPDATER_ID,
    ADMINISTRATOR.CREATE_DATE,
    ADMINISTRATOR.UPDATE_DATE
FROM
    ADMINISTRATOR left outer join ADMINISTRATOR_CONFIG AdministratorConfigAsOne on ADMINISTRATOR.ADMINISTRATOR_ID = AdministratorConfigAsOne.ADMINISTRATOR_ID
WHERE
    ADMINISTRATOR.ADMINISTRATOR_CODE = 'ADMIN1' AND
    AdministratorConfigAsOne.DISABLE = 'N'

のように全く変化がなく,Joinのエイリアスが短いものに変わりません.

よろしくお願いいたします.

───────────────────────────────
 株式会社 グランテック
 代表取締役社長
 加藤 潤一 Junichi Kato

〒154-0012
東京都世田谷区駒沢2-16-1 サンドー駒沢ビル4F
TEL 050-5538-2383  FAX 03-3487-7211
HP : http://www.grandtech.jp/
BLOG : http://d.hatena.ne.jp/j5ik2o/
E-MAIL : [E-MAIL ADDRESS DELETED]




Seasar-user メーリングリストの案内