[Seasar-user:13172] Re: 【DBFlute】ConditionBeanのSQLにスキーマ名を付けたい
kubo
[E-MAIL ADDRESS DELETED]
2008年 3月 6日 (木) 16:56:34 JST
久保です。
もりさん、了解しました。
一応、お伝えした修正そのままで次バージョンへ反映する
つもりですので、そのままでも大丈夫だと思われます。
が、念のため後で「正式バージョンじゃないと気持ち悪い」とか
思うこともあるかもしれませんので、今回の修正だけを
反映させた次バージョンを速めにリリースしますね。
(あとの判断はお任せいたします)
# スキーマ名付きSQLの要望は以前別のところでも(1件だけ)あったので、
# レアケースとは言え、現場適応のための大事な機能になりそうですね。
# ご報告・確認、本当にありがとうございました。
他のユーザの方のためにこの場を借りて
以下にこの機能を説明させて頂きます。
build-xxx.propertiesでこのように指定すると(デフォルトfalse):
torque.isAvailableAddingSchemaToTableSqlName = true
↓
ConditionBeanで発行されるSQLにおいて
select ... from [schema].MEMBER where ...
というようにテーブル名の前にスキーマ名が付与されるようになります。
スキーマ名を付与しないとSQLが実行できないようなDB環境の場合に
対処することが可能です。
2008/3/6 森和紀 <[E-MAIL ADDRESS DELETED]>:
> 久保さん
>
> お世話になっております。もりです。
>
> > プロジェクトの都合としてリリース時期の要望はありますでしょうか?
> とくにありません。
> 対応していただき、とくに問題ないのでこのままでもいいかなと考えています。
> (最近は大きな修正もないようなので。)
>
>
>
> 以上です。
>
> 08/03/06 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > 久保です。
> >
> > 森さん、ご報告ありがとうございます。
> >
> > しばらくその修正で対応お願いします。
> > 次バージョンに正式に含めたいと思いますが、
> > プロジェクトの都合としてリリース時期の要望はありますでしょうか?
> >
> > 2008/3/6 森和紀 <[E-MAIL ADDRESS DELETED]>:
> > > 久保さん
> > >
> > > お世話になっております。森です。
> > >
> > > 問題なく、スキーマつきのSQLが発行されるようになりました。
> > > すばやい対応ありがとうございます。
> > >
> > >
> > >
> > > 以上です。
> > >
> > > 08/03/06 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > 久保です。
> > > >
> > > > 森さん
> > > >
> > > > ありがとうございます。
> > > >
> > > > お手数ですが、以下のことを試して頂けないでしょうか?
> > > >
> > > > mydbflute/dbflute-0.6.4/templates/om/java/配下のテンプレートを修正します。
> > > >
> > > > 1.cbean/AbstractBsConditionQuery.vmに以下を追加
> > > >
> > > > public String getTableSqlName() {
> > > > return "${table.tableSqlName}";
> > > > }
> > > >
> > > > 2.cbean/BsConditionQuery.vmに以下の修正
> > > >
> > > > setupOuterJoin_${foreignKeys.foreignPropertyNameInitCap}()
> > > > メソッドの最後のセンテンスのgetSqlClause().registerOuterJoin(...)
> > > > の第一引数を
> > > > getConditionQuery${foreignKeys.foreignPropertyNameInitCap}().getTableSqlName()
> > > > に修正
> > > >
> > > > setupOuterJoin_${referrer.referrerPropertyNameInitCapAsOne}()
> > > > メソッドも同様の部分を
> > > > getConditionQuery${referrer.referrerPropertyNameInitCapAsOne}().getTableSqlName()
> > > > に修正
> > > >
> > > > 3.allcommon/DBMetaInstanceHandler.vmに以下の処理を追加
> > > >
> > > > findDBMeta()の例外をthrowする手前で以下の部分を追加
> > > >
> > > > ----- ここから
> > > > final int dotLastIndex = tableFlexibleName.lastIndexOf(".");
> > > > if (dotLastIndex >= 0) {
> > > > try {
> > > > return
> > > > findDBMeta(tableFlexibleName.substring(dotLastIndex + 1));
> > > > } catch (IllegalStateException e) {
> > > > // Nothing
> > > > }
> > > > }
> > > > ----- ここまで
> > > > String msg = "The instance map returned null by the key: key="
> > > > + tableFlexibleName + " instanceMap=" + _tableDbNameInstanceMap;
> > > > throw new IllegalStateException(msg);
> > > >
> > > > よろしくお願いします。
> > > >
> > > >
> > > > 2008/3/6 森和紀 <[E-MAIL ADDRESS DELETED]>:
> > > > > お世話になっています。森です。
> > > > >
> > > > > 現在でているログを記載します。
> > > > > ご確認ください。
> > > > >
> > > > > <ログ>
> > > > > java.lang.IllegalStateException: The instance map returned null by the
> > > > > key: key=XXX instanceMap={XXX}
> > > > > at dbflute.allcommon.dbmeta.TcDBMetaInstanceHandler.findDBMeta(TcDBMetaInstanceHandler.java:340)
> > > > > at dbflute.allcommon.cbean.sqlclause.TcAbstractSqlClause.getSelectClause(TcAbstractSqlClause.java:203)
> > > > > at dbflute.allcommon.cbean.sqlclause.TcAbstractSqlClause.getClause(TcAbstractSqlClause.java:133)
> > > > > at dbflute.allcommon.cbean.TcAbstractConditionBean.toString(TcAbstractConditionBean.java:582)
> > > > > at java.lang.String.valueOf(Unknown Source)
> > > > > at java.lang.StringBuffer.append(Unknown Source)
> > > > > at dbflute.allcommon.util.TcTraceViewUtil.convertObjectArrayToStringView(TcTraceViewUtil.java:62)
> > > > > at dbflute.allcommon.s2dao.TcS2DaoInterceptor.dispatchInvoking(TcS2DaoInterceptor.java:142)
> > > > > at dbflute.allcommon.s2dao.TcS2DaoInterceptor.invoke(TcS2DaoInterceptor.java:70)
> > > > > at dbflute.exdao.XXXDao$$EnhancedByS2AOP$$2f7cfe$$MethodInvocation$$selectList3.proceed(MethodInvocationClassGenerator.java)
> > > > > at dbflute.exdao.XXXDao$$EnhancedByS2AOP$$2f7cfe.selectList(XXXDao$$EnhancedByS2AOP$$2f7cfe.java)
> > > > > at dbflute.bsbhv.BsXXXBhv.delegateSelectList(BsXXXBhv.java:708)
> > > > > at dbflute.bsbhv.BsXXXBhv.selectList(BsXXXBhv.java:266)
> > > > > at web.list.ListPage.doCreateFile(List01003Page.java:59)
> > > > > at web.list.ListPageTest.test_doCreateFile_正常_Tx(ListPageTest.java:50)
> > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > > > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> > > > > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> > > > > at java.lang.reflect.Method.invoke(Unknown Source)
> > > > > at junit.framework.TestCase.runTest(TestCase.java:164)
> > > > > at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:324)
> > > > > at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:92)
> > > > > at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:188)
> > > > > at junit.framework.TestResult$1.protect(TestResult.java:106)
> > > > > at junit.framework.TestResult.runProtected(TestResult.java:124)
> > > > > at junit.framework.TestResult.run(TestResult.java:109)
> > > > > at junit.framework.TestCase.run(TestCase.java:120)
> > > > > at junit.framework.TestSuite.runTest(TestSuite.java:230)
> > > > > at junit.framework.TestSuite.run(TestSuite.java:225)
> > > > > at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
> > > > > at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
> > > > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
> > > > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
> > > > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
> > > > > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
> > > > >
> > > > > 以上、よろしくお願いします。
> > > > >
> > > > >
> > > > >
> > > > > 08/03/06 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > > > 久保です。
> > > > > >
> > > > > > 森さん
> > > > > >
> > > > > > すいません、
> > > > > > ・DBMetaInstanceHandler#findDBMetaでIllegalStateExceptionが発生する。
> > > > > > の、スタックトレースを5行ほど教えていただけませんでしょうか?
> > > > > >
> > > > > > 2008/3/6 森和紀 <[E-MAIL ADDRESS DELETED]>:
> > > > > > > 久保様
> > > > > > >
> > > > > > > お世話になっております。森です。
> > > > > > >
> > > > > > > 回答ありがとうございます。
> > > > > > >
> > > > > > > > 回避策はないと思われますので、DBFluteの方を直します。
> > > > > > > お手数をおかけして申し訳ありません。
> > > > > > > 対応よろしくお願いいたします。
> > > > > > >
> > > > > > > 以上です。
> > > > > > >
> > > > > > > 08/03/06 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > > > >
> > > > > > >
> > > > > > > > 久保です。
> > > > > > > >
> > > > > > > > 森さん、こんにちは
> > > > > > > >
> > > > > > > > 詳細な現象報告ありがとうございます。
> > > > > > > > 回避策はないと思われますので、DBFluteの方を直します。
> > > > > > > >
> > > > > > > > > DBMetaInstanceHandler#findDBMetaでIllegalStateException
> > > > > > > > DBMetaInstanceHandlerを修正することになりそうです。
> > > > > > > > Schema名付きのキー値を指定されたら、そのスキーマ名で
> > > > > > > > 該当のDBMetaを探し出すような仕組みにします。
> > > > > > > >
> > > > > > > > > 結合するテーブルにスキーマ名が付かない
> > > > > > > > これはまさしく結合先テーブルを生成しているところで、
> > > > > > > > スキーマ名の付いている方を利用するように修正します。
> > > > > > > >
> > > > > > > >
> > > > > > > > 2008/3/6 森和紀 <[E-MAIL ADDRESS DELETED]>:
> > > > > > > > > いつもお世話になっております。
> > > > > > > > > 森と申します。
> > > > > > > > >
> > > > > > > > > build.properties に下記を設定し、スキーマ名をつけたSQLは発行しているのですが、
> > > > > > > > > 2点問題があります。
> > > > > > > > > torque.isAvailableAddingSchemaToTableSqlName = true
> > > > > > > > >
> > > > > > > > > ・DBMetaInstanceHandler#findDBMetaでIllegalStateExceptionが発生する。
> > > > > > > > > 原因は、このクラスに定義されているテーブル名にはスキーマ名はついておらず、
> > > > > > > > > 検索するキーはスキーマ名付きのテーブル名となってしまうためです。
> > > > > > > > > ログを添付します。
> > > > > > > > >
> > > > > > > > > ・結合するテーブルにスキーマ名が付かない。
> > > > > > > > > ConditionBean の setupSelect を行なったときに、結合先のテーブルにスキーマ名が
> > > > > > > > > 付きません。
> > > > > > > > >
> > > > > > > > > Version:DBFlute 0.6.4
> > > > > > > > >
> > > > > > > > > 上記2点の対応策などありましたら、ご教示ください。
> > > > > > > > >
> > > > > > > > > 以上、よろしくお願いいたします。
> > > > > > > > >
> > > > > > > > > _______________________________________________
> > > > > > > > > Seasar-user mailing list
> > > > > > > > > [E-MAIL ADDRESS DELETED]
> > > > > > > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > > > > > > >
> > > > > > > > >
> > > > > > > > _______________________________________________
> > > > > > > > Seasar-user mailing list
> > > > > > > > [E-MAIL ADDRESS DELETED]
> > > > > > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > > > > > >
> > > > > > > _______________________________________________
> > > > > > > Seasar-user mailing list
> > > > > > > [E-MAIL ADDRESS DELETED]
> > > > > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > > > > >
> > > > > > _______________________________________________
> > > > > > Seasar-user mailing list
> > > > > > [E-MAIL ADDRESS DELETED]
> > > > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > > > >
> > > > > _______________________________________________
> > > > > Seasar-user mailing list
> > > > > [E-MAIL ADDRESS DELETED]
> > > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > > >
> > > > _______________________________________________
> > > > Seasar-user mailing list
> > > > [E-MAIL ADDRESS DELETED]
> > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > >
> > > _______________________________________________
> > > Seasar-user mailing list
> > > [E-MAIL ADDRESS DELETED]
> > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内