[Seasar-user:21974] Re: 【S2JDBC】OracleのLIKE検索で全角%がエスケープされない

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2014年 10月 20日 (月) 02:54:46 JST


小林 (koichik) です。

遅くなりましたが、修正してスナップショットを
デプロイしたのでご確認ください。
# 今回修正したのはs2-tigerのみ。

http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-framework/2.4.48-SNAPSHOT/s2-framework-2.4.48-20141019.174214-3.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-extension/2.4.48-SNAPSHOT/s2-extension-2.4.48-20141019.174214-3.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2-tiger/2.4.48-SNAPSHOT/s2-tiger-2.4.48-20141019.174937-3.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/container/s2jdbc-gen/2.4.48-SNAPSHOT/s2jdbc-gen-2.4.48-20141019.175007-3.jar


s2jdbc.dicon辺りで以下のように設定してください。

    <component name="jdbcManager"
      class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
        ...

        <initMethod>
          @org.seasar.extension.jdbc.util.LikeUtil @ setWildcardPatternAsString("[%_]"),
          @org.seasar.extension.jdbc.util.LikeUtil @ setWildcardReplacementPatternAsString("[$%_]")
        </initMethod>
    </component>



On Fri, 26 Sep 2014 13:14:41 +0000, "Taki, Minoru" <taki.minoru @ jp.fujitsu.com> wrote:

> 小林さん
> 
>  瀧です。
> 
>  お世話になっております。
> 
> > 本来はDialectで対応できるといいのですが、現状はLikeUtilという
> > Dialectに手が届かないところで処理しているので、diconで
> > カスタマイズできるような修正をしようと思います。
> 
>  さっそくのご判断ありがとうございます。
> 
> > 急いで対応が必要なら、リフレクションでLikeUtilの定数を
> > 書き換えてください。
> > 
> > https://github.com/seasarorg/seasar2/blob/master/s2-tiger/src/main/java/org/seasar/extension/jdbc/util/LikeUtil.java
> > #L29-L34
> 
>  情報ありがとうございます。
>  参考にさせて頂きますが、ちょっと私には手が出せないかもです。
> 
>  以上です。
> 
> --
> 瀧  稔 (Taki Minoru)
> E-mail: taki.minoru @ jp.fujitsu.com
> 
> > -----Original Message-----
> > From: seasar-user-bounces @ ml.seasar.org [mailto:seasar-user-bounces @ ml.seasar.org] On Behalf Of Koichi Kobayashi
> > Sent: Friday, September 26, 2014 7:42 PM
> > To: seasar-user @ ml.seasar.org
> > Subject: [Seasar-user:21954] Re: 【S2JDBC】OracleのLIKE検索で全角%がエスケープされない
> > 
> > 小林 (koichik) です。
> > 
> > 本来はDialectで対応できるといいのですが、現状はLikeUtilという
> > Dialectに手が届かないところで処理しているので、diconで
> > カスタマイズできるような修正をしようと思います。
> > 
> > 急いで対応が必要なら、リフレクションでLikeUtilの定数を
> > 書き換えてください。
> > 
> > https://github.com/seasarorg/seasar2/blob/master/s2-tiger/src/main/java/org/seasar/extension/jdbc/util/LikeUtil.java
> > #L29-L34
> > 
> > 2014年9月26日 14:50 kubo <dbflute @ gmail.com>:
> > > 久保(jflute)です
> > >
> > >> #エスケープすることの方が問題???ちょっとよくわからなくなってきました。
> > >
> > > S2JDBCではありませんが、
> > > 「Oracle11gR2でLike検索でエラーになるケース」
> > > というのがあって四苦八苦した記憶があります。
> > > https://groups.google.com/forum/#!topic/dbflute/LzuHYseRtmA
> > >
> > > 参考までにと。
> > > (後半ちょっと違い話題になっちゃっていますが)
> > >
> > >
> > > 2014-09-26 13:51 GMT+09:00 Taki, Minoru <taki.minoru @ jp.fujitsu.com>:
> > >> 瀧と申します。
> > >>
> > >>  お世話になっております。
> > >>
> > >>>  LIKE検索(使用したのはcontains関数)で全角パーセント("%")がエスケープされず例外が発生します。
> > >>>  知らなかったのですが、Oracleの場合、全角のパーセント("%")と全角のアンダーバー("_")も
> > >>>  特殊文字として扱われるようです。(もちろん半角は問題なくエスケープされています)
> > >>
> > >>  一部わかったことがありましたので、補足します。
> > >>
> > >>  全角%だけの検索を行うと下記のログが出力されました。
> > >>  実際はエスケープの処理をさせようとしているみたいなのですが、
> > >>  このままのSQLでは通らないようです。
> > >>
> > >> #エスケープすることの方が問題???ちょっとよくわからなくなってきました。
> > >>
> > >> ----
> > >> [26/09/2014 13:13:09:782 +0900] DEBUG 2014-09-26 13:13:09,782 [httpWorkerThread-80-4] select count(*) from XXXXXXX_XXX
> > T1_ where (T1_.ITEMCD like '%$%%' escape '$') order by T1_.ITEMCD
> > >> ・
> > >> ・<中略>
> > >> ・
> > >> Caused by: org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[select count(*) from XXXXXXX_XXX
> > T1_ where (T1_.ITEMCD like ? escape '$') order by T1_.ITEMCD], Message=[1424], ErrorCode=22025, SQLState={3})が発生し
> > ました
> > >>         at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:72)
> > >>         at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:67)
> > >>         at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:83)
> > >>         at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:49)
> > >>         ... 136 more
> > >> Caused by: java.sql.SQLDataException: ORA-01424: エスケープ文字に続く文字がないか、または無効です。
> > >>
> > >> [26/09/2014 13:13:09:797 +0900]         at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
> > >>         at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
> > >>         at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
> > >>         at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
> > >>         at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
> > >>         at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
> > >>         at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208)
> > >>         at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:886)
> > >>         at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175)
> > >>         at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296)
> > >>         at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613)
> > >>         at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657)
> > >>         at
> > oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495)
> > >>         at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:81)
> > >>         ... 137 more
> > >> [26/09/2014 13:13:09:797 +0900] DEBUG 2014-09-26 13:13:09,797 [httpWorkerThread-80-4] トランザクションをロールバッ
> > クしました。tx=[FormatId=4360, GlobalId=1411694427314/362, BranchId=]
> > >> [26/09/2014 13:13:09:797 +0900] DEBUG 2014-09-26 13:13:09,797 [httpWorkerThread-80-4] 論理的なコネクションを閉じま
> > した。tx=[FormatId=4360, GlobalId=1411694427314/362, BranchId=]
> > >> ----
> > >>
> > >>  以上です。
> > >>
> > >>> -----Original Message-----
> > >>> From: seasar-user-bounces @ ml.seasar.org [mailto:seasar-user-bounces @ ml.seasar.org] On Behalf Of Taki, Minoru
> > >>> Sent: Friday, September 26, 2014 12:16 PM
> > >>> To: 'seasar-user @ ml.seasar.org'
> > >>> Subject: [Seasar-user:21947] 【S2JDBC】OracleのLIKE検索で全角%がエスケープされない
> > >>>
> > >>> 瀧と申します。
> > >>>
> > >>>  お世話になっております。
> > >>>
> > >>>  Oracle11R2でS2JDBCのjdbcManagerの自動生成SQLを使用しておりますが、
> > >>>  LIKE検索(使用したのはcontains関数)で全角パーセント("%")がエスケープされず例外が発生します。
> > >>>  知らなかったのですが、Oracleの場合、全角のパーセント("%")と全角のアンダーバー("_")も
> > >>>  特殊文字として扱われるようです。(もちろん半角は問題なくエスケープされています)
> > >>>
> > >>>  自動生成SQLではできないことなのでしょうか?
> > >>>  ご教授ください。
> > >>>
> > >>> --
> > >>> 瀧  稔 (Taki Minoru)
> > >>> E-mail: taki.minoru @ jp.fujitsu.com
> > >>>
> > >>>
> > >>>
> > >>> _______________________________________________
> > >>> Seasar-user mailing list
> > >>> Seasar-user @ ml.seasar.org
> > >>> https://ml.seasar.org/mailman/listinfo/seasar-user
> > >> _______________________________________________
> > >> Seasar-user mailing list
> > >> Seasar-user @ ml.seasar.org
> > >> https://ml.seasar.org/mailman/listinfo/seasar-user
> > > _______________________________________________
> > > Seasar-user mailing list
> > > Seasar-user @ ml.seasar.org
> > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > _______________________________________________
> > Seasar-user mailing list
> > Seasar-user @ ml.seasar.org
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user


-- 
{
  name: "Koichi Kobayashi",
  mail: "koichik @ improvement.jp",
  blog: "http://d.hatena.ne.jp/koichik/",
  twitter: "@koichik"
}



Seasar-user メーリングリストの案内