[Seasar-user:13167] Re: 【DBFlute】ConditionBeanのSQLにスキーマ名を付けたい

kubo [E-MAIL ADDRESS DELETED]
2008年 3月 6日 (木) 12:51:47 JST


久保です。

森さん

ありがとうございます。

お手数ですが、以下のことを試して頂けないでしょうか?

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