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