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