[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 メーリングリストの案内