2017-06-16 14 views
1

'where'句に2つ以上のパラメータを持つオブジェクトリストをsqlにバインドする方法を知りたい。spring jdbctemplate - 1つ以上のパラメータで構成されるリストをクエリargsにバインドする方法

Select * from order where order_id = ? and action_code = ? 

データはここ

List<Order> orderList = new ArrayList<>(); 
orderList.add(1,"KP"); 
orderList.add(2,"DP"); 
orderList.add(3,"KP"); 

のようなものですが、私は私が注文のリストを持っている を試みたものです。各注文には注文ID(ロング)とアクションコード(ストリング)があります。今すぐ私はwhere句のパラメータとして注文IDとアクションコードでDBを照会する必要があります。

* from order from order_id =? action_code =?

argsにオブジェクトの配列を渡そうとしました。 [このdint仕事]。

Object[] args = new Object[ size of orderList ] 
int i = 0 
for (Order order : orderList) 
{ 
    args[i] = new Object[]{order.getOrderId(), order.getActionCode()}; 
    i++; 
} 

は、私は私がアプリを実行すると、私はエラーの下に取得

jdbcTemplate.query(sql, args, rowMapper); 

以下のようにクエリを発射しています。

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT * where ORD_I = ? AND ACT_C = ?]; SQL state [99999]; error code [17004]; Invalid column type; nested exception is java.sql.SQLException: Invalid column type 

それは私が[DBで、ORDER_IDは、数(38)で、これまで私は、以下のようなタイプを提供してきた を試してみましたが、何

jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, rowMapper); 

の作品次のように私はデータを渡す場合は、action_codeがされChar(2))

int[] types = new int[] { java.sql.Types.NUMERIC, java.sql.Types.CHAR 
}; 
jdbcTemplate.query(sql, args, types, rowMapper); 

例外があります。 [私はjava.sql.Types.VARCHARでjava.sql.Types.CHARを置き換え、同じエラー]

org.springframework.dao.InvalidDataAccessApiUsageException: args and argTypes parameters must match 

私は問題 How set Array/List in Spring jdbcTemplate as parameter?の下に言及している

int[] types = new int[] { java.sql.Types.NUMERIC, java.sql.Types.CHAR 
    }; 
jdbcTemplate.query(sql, new Object[] {orderList.get(0).getOrderId, orderList.get(0).getActionCode()}, types, rowMapper); 

以下の設定の作品 - 交渉リストから1つのパラメータを渡すことについて

how to bind a list of tuples using Spring JDBCTemplate? - タプルに関する話。 tableA.id = tableB.idとtableA.id =を使って2つのテーブルをクエリしなければならない場合は?とtableB.seq_id =?の場合、上記の解決策は機能しません。

私はたくさんのグーグルで探せましたが、今は道路ブロックにぶつかりました。親切に助けてください。

答えて

0

この解決策はリストでは機能しませんが、通常のjdbcTemplateの代わりにNamedParameterJdbcTemplatesを使用することをお勧めします。それははるかに簡単ですし、比較的軽微な変更:

SQL:

Select * from order where order_id = :orderId and action_code = :actionCode 

のorderIDactionCodeは(下記参照)お使いのパラメータのHashMap内の文字列のキー値に対応しています。

のJava:

Map<String, Object> parameters = new HashMap<>(); 
parameters.put("orderID","KP"); 
parameters.put("actionCode","DP"); 

namedParameterJdbcTemplate.execute(sqlQueryString, parameters); 

あなたは、文字列のキーとキーと値のマップにすべてのパラメータをロード。

編集コメントに答えるために:

なぜループ内でクエリを実行し、マップに結果を保存しませんか?私は擬似コードのために考えています。ここでは

for (set in parameterSet){ 
parameters.put(set1, set2); 
ResultSet rs = jdbcTemplate.execute(queryString, parameters); 
otherMap.put(set1 + set2, rs);} 

setparameterSetsを照会するorderIDactionCodeのすべての組み合わせ(セット)あり、orderIDactionCodeパラメータの組み合わせである、とotherMapは、いくつかのマップであり、 1回目と2回目のセット・パラメーターの連結をキーとして使用し、結果セットを値として使用して、forループを超えてデータを永続化するために作成するコレクション。コメントをフォローアップのための

編集:

あなたが1000年のユニークなペアを持っている場合は、そのパラメータのこれらのユニークなペアのそれぞれが別個の、相互に排他的なResultSetを返すべきであることを意味します。たとえば、WHERE条件でパラメータAとBを入力すると、パラメータAとCでの入力とは異なる結果セットが返されます。これを回避するショートカットは表示されません。あなたは本質的に1000の異なる質問をしていますが、それぞれ異なる答えがあります。しかし、これはあなたがしたいと思うよりもはるかに多くの行を生成する

WHERE parameter1 IN (... all possible values for parameter1) AND 
parameter2 IN (... all possible values for parameter2) 

:あなたはすべてのあなたのResultSetを取得し、唯一のクエリを実行確保するための唯一の方法は、最初のパラメータと2番目のパラメータのすべての可能な値に供給することによってです。独自のロジックをプログラムで適用して、一意のパラメータの組み合わせに属さない結果セットを除外する必要があります。

+0

遅く応答して申し訳ありません...仕事から離れていました。しかし、キー "orderId"または "actionCode"は同じままであるので、データはforループ中に上書きされます。これについてどうやって行くの? –

+0

私の編集した応答をチェックして、私は解決策を提案しようとしました。 –

+0

私は1000のオーダーIDとacioncodeのペアを持っているなら、このアプローチでは1000の選択クエリを起動する必要があります。大きなパフォーマンスヒットthts。 doesntのspring jdbcテンプレートには、このシナリオに対応するための機能がありますか、ここで何か不足していますか?助けを深く感謝します。 –

関連する問題