- - PR -
iBATISとOracleの連携
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-11-01 00:37
iBATISを使用しての検索処理で困った自体が発生したため、お知恵を貸してください。
TABLE DATA ============= HOGE(サイズ3) ---- 01 ============= SqlMap ======================================= <select id="selectList" resultMap="public_dummy" parameterClass="dummyDto" > select count(*) as cc from dummytable where hoge = #hoge:CHAR# </select> ======================================= parameterClassに渡すDTOにdummyDto.setHoge("01")として、上記selectListを実行すると一件もヒットしません。 dummyDto.setHoge("01 ")(最後に空白追加)とすると、ヒットします。 これはoracle jdbcの仕様なのでしょうか?空白を追加せずに、検索にヒットさせる方法がありましたら、ご教授願いします。 環境: JDK1.5 iBATIS 2.3 Spring 2.0 Oracle10g jdbc:ojdbc14 TransactionManager:DataSourceTransactionManager DataSource:DriverManagerDataSource | ||||
|
投稿日時: 2007-11-01 01:26
varchar2じゃなくてcharだからじゃありませんか?
| ||||
|
投稿日時: 2007-11-01 07:26
「:CHAR」はずしても同じですか?
| ||||
|
投稿日時: 2007-11-01 07:27
後はテーブルのカラムの型を教えてください。
VARCHARだとマッチしなくて当然です。 | ||||
|
投稿日時: 2007-11-01 07:41
カラムの型にもよるけど、
[ ](半角スペース)で空白部分を埋めるという仕様がある型だからかとおもわれます。 | ||||
|
投稿日時: 2007-11-01 09:57
返答ありがとうございます。
>かつのりさん ご指摘の通りですね・・VARCHAR2だと空白関係なしに動きます。 自分の勉強不足が身にしみます。。 >Anthyhimeさん 「:CHAR」はずしても同じでした。さらに「:VARCHAR」としても変わりませんでした。 iBATISはここの文字列を何に使っているんでしょうか・・ カラム型はCHAR型です。 気になったのが、 where hoge = #hoge:CHAR# を where hoge = '01' (空白埋めなし) とすると検索がヒットしました。と、いうことはJDBCではなく、iBATISの問題なんですかねぇ。。 | ||||
|
投稿日時: 2007-11-01 11:56
「:」以下の文字列はTypeHandlerの決定のために利用されます。
CHARもVARCHARも「:」をはずしても同じTypeHanderが利用されるはずなので差はないと思います。 内部ではPreparedStatementのsetString()をコールしているだけのはずなので、 実質的に、
は同じ意味になるはずなのですが・・・・。 該当のSQLをPreparedStatementのsetString()で直接値をマッピングすると どうなるでしょうか? | ||||
|
投稿日時: 2007-11-01 13:41
>Anthyhimeさん
返答ありがとうございます。 「:」以下はTypeHandlerの判定だったのですね。CharでもVarcharでも(指定なしでも)StringTypeHandlerが設定されることを確認しました。 ご指摘の件ですが。PreparedStatement.setString(1, "01")と実行してもヒットしないです。。もちろんsetString(1, "01 ")とするとヒットします。 ※com.ibatic.sqlmap.engine.execution.SqlExecutorを書き換えて実行してます [ メッセージ編集済み 編集者: キタキツネ 編集日時 2007-11-01 13:43 ] |