2011-08-17 9 views
6

値(1, 2, 3など)があり、SQLクエリにそのリストを渡したい:SQLクエリでListを渡す方法

"select name from tbl where id in" + list 

どうすればよいでしょうか?

+0

あなたのSQLを構築するために使用しているのは? – hvgotcodes

+0

Hql executQuery() – n92

答えて

0

SQLの構文は次のとおりです。

select name from tbl where id in (1,2,3) 

あなたがしなければならないのは、項目のカンマ区切りリストを作成し、文字列に挿入されます。

ああ、義務的なSQL文字列の建物の警告:しないでください!

0

リストをカンマ区切りリストとして渡し、分割関数を使用して一時テーブル変数に分割します。

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512)) 
RETURNS table 
AS 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
) 
+3

戦術的な核を持つウサギの狩りについて話してください...またはMicrosoftの報告サーバーを基本的には同じことを使用してください。 – Blindy

+0

私は「このリストをストアドプロシージャに渡すにはどうすればいいのか」という疑問を誤解していたと思います。私の悪い。 – RKeast

0

どのようにSQLを構築しているかによって異なります。あなたはそれをあなたのようなSQLに見えるように行う必要があり、自分自身(悪いアイデア)を構築している場合 - あなたはHQLを休止指定あなたのコメントであるので

... where id in (1,2,3)...

を、のようなもの -

Query query = session.createSQLQuery("from User where id in :ids "); 
query.setParameter("ids", idsList); 
List list = query.list(); 

を取得する必要がありますあなたは始まった。注Userは、照会する表にマップしたオブジェクトの名前です。

+0

エラーを取得する「メソッドcreteateQuery()のシグネチャがありません」 – n92

+0

@vayay、 – hvgotcodes

-1

文字列sqlQuery = "tblから名前を選択します。" id + "sqlFormatedList(list);あなたは、SQLステートメントに直接

例リストを配置する必要が

private String sqlFormatedList(List<Integer> list){ 
StringBuilder sb = new StringBuilder(); 
sb.append("("); 
for (Integer i : list){ 
    sb.append(i+","); 
} 
sb.deleteCharAt(sb.length() -1); 
sb.append(")"); 
return sb.toString(); 
} 
+0

を編集して問題に失敗したコードとスタックトレースを投稿するようになりました。(123)として[1,2,3]を取得しています。私はIDと比較していますが、IDは整数ですが、 "sb"は文字列なので、それを作る方法 – n92

+0

申し訳ありませんが、私はあなたのためにそれを修正します。 – Farmor

5

String sql="select name from tbl where id in ("+StringUtils.join(list, ',')+")"; 
Statement st=connection.createStatement(); 
st.execute(sql); 
+0

Java 8では 'String.join("、 "、list)'を使うことができますが、この解決法はStringパラメータには適していません。 – Pino

3

を私はあなたがHQLを使用しているコメントへの返信で参照してください。

where id in (:ids) 

をして、あなたのリストを渡しsetParameterList("ids", list)を使用します。その場合は、Hibernateの人々は、クエリでは、単に指定し、あなたのためにこの1つは簡単になります。 Hibernateはあなたのためにすべての拡張を行います!

0

私はFarmourが提供するソリューションを試しました。そのシンプルで効率的な&が機能します。 私はそれを私の必要に応じてビットを修正しました... &は、まさに私が望むようにフォーマットされたことを保証するためにデバッグを試みました。

public static String sqlFormatedList(List codeList){StringBuilder sb = new StringBuilder(); sb.append( "(");簡単で

 for (String str : codeList){ 
    sb.append("'"+str+"',"); 
    } 
    sb.deleteCharAt(sb.length() -1); 
    sb.append(")"); 
return sb.toString(); 
} 

分析: 入力PARAMS:[ABC、MNP、XYZ];のようにJava形式の文字列のリスト

出力:( 'ABC' 、 'MNP'、 'XYZ'); SQLクエリで使用される文字列。

sqlFormattedString =( 'ABC'、 'MNP'、 'XYZ');

上記のo/p文字列がこのクエリに入ります。select * from tableName tnここで、tn.codeはsqlFormattedStringにあります。

PS:パラメータリストのコードリストは、java.util.Listです。