- PR -

iBATISとOracleの連携

投稿者投稿内容
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 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
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-01 01:26
varchar2じゃなくてcharだからじゃありませんか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-01 07:26
「:CHAR」はずしても同じですか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-01 07:27
後はテーブルのカラムの型を教えてください。
VARCHARだとマッチしなくて当然です。
朝日奈 ありす
ベテラン
会議室デビュー日: 2007/10/28
投稿数: 57
お住まい・勤務地: 北の都
投稿日時: 2007-11-01 07:41
カラムの型にもよるけど、

[ ](半角スペース)で空白部分を埋めるという仕様がある型だからかとおもわれます。
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 2007-11-01 09:57
返答ありがとうございます。

>かつのりさん
ご指摘の通りですね・・VARCHAR2だと空白関係なしに動きます。
自分の勉強不足が身にしみます。。

>Anthyhimeさん
「:CHAR」はずしても同じでした。さらに「:VARCHAR」としても変わりませんでした。
iBATISはここの文字列を何に使っているんでしょうか・・
カラム型はCHAR型です。

気になったのが、
where hoge = #hoge:CHAR#

where hoge = '01' (空白埋めなし)

とすると検索がヒットしました。と、いうことはJDBCではなく、iBATISの問題なんですかねぇ。。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2007-11-01 11:56
「:」以下の文字列はTypeHandlerの決定のために利用されます。
CHARもVARCHARも「:」をはずしても同じTypeHanderが利用されるはずなので差はないと思います。
内部ではPreparedStatementのsetString()をコールしているだけのはずなので、
実質的に、
引用:

where hoge = #hoge:CHAR#

where hoge = '01' (空白埋めなし)


は同じ意味になるはずなのですが・・・・。
該当のSQLをPreparedStatementのsetString()で直接値をマッピングすると
どうなるでしょうか?
キタキツネ
常連さん
会議室デビュー日: 2006/11/23
投稿数: 32
お住まい・勤務地: 沖縄県名護市
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)