2011-08-17 18 views
6

que tengo de valores (1, 2, 3, por ejemplo), y quiero pasar esa lista a una consulta SQL:Cómo pasar lista en la consulta SQL

"select name from tbl where id in" + list 

¿Cómo puede ocurrir lograr esto?

+0

lo está usando para construir su SQL? – hvgotcodes

+0

Hql executQuery() – n92

Respuesta

0

La sintaxis SQL es:

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

Todo lo que tiene que hacer es construir la coma lista de elementos separados e insertarlo en la cadena.

Ah, y la obligatoriedad de la cadena de sql de advertencia de construcción: ¡no!

0

Pase la lista como una lista separada por comas y use una función dividida para dividirla en una variable de tabla temporal.

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

Hablando de la caza de conejos con armas nucleares tácticas ... O usando el servidor de informes de Microsoft, básicamente lo mismo. – Blindy

+0

Creo que no entendí la pregunta como "cómo paso esta lista a un procedimiento almacenado". Mi error. – RKeast

0

depende de cómo está construyendo su sql. Si usted está construyendo por sí mismo (mala idea) que tiene que hacer que el aspecto de SQL como -

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

Dado que en su comentario se especifica Hibernate HQL, algo así como -

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

debe recibir tú empezaste. La nota User es el nombre del objeto que asignó a la tabla que desea consultar.

+0

Obteniendo un error "No signature of method creteateQuery()" – n92

+0

@vinay, publico el código de falla y stacktrace en la pregunta editando – hvgotcodes

-1

Cadena sqlQuery = "seleccionar nombre de tbl donde id en" + sqlFormatedList (lista);

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

ahora estoy obteniendo [1,2,3] como (123), entonces cómo tener comas cadena separada, estoy comparando con la identificación, la identificación es entera pero la "sb" es una cadena, así que cómo hacerlo – n92

+0

Lo siento, lo arreglaré por ti 1min, así que arreglado. – Farmor

5

usted tiene que poner su lista directamente a la declaración de sql

ejemplo:

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

Con Java 8 puede usar 'String.join (", ", list)', sin embargo, esta solución no es apropiada para los parámetros de String. – Pino

3

veo en su respuesta a un comentario que está utilizando HQL. Si ese es el caso, las personas hacen de este uno de Hibernate fácil para usted, en la consulta, sólo tiene que especificar:

where id in (:ids) 

y luego usar setParameterList("ids", list) pasar su lista. ¡Hibernate hará toda la expansión por ti!

0

Probé la solución provista por Farmour. Es simple, eficiente & funciona. Lo modifiqué lil bit de acuerdo con mi necesidad ... & también probé la depuración para asegurarme de que su formato sea exactamente como yo quiero.

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(); 
} 

Análisis en breve: de entrada Parámetros: [ABC, MNP, XYZ]; como lista de cadenas de formato Java

de salida: ('ABC' , 'MNP', 'XYZ'); como String para ser utilizado en la consulta SQL.

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

Esta cadena de o/p anterior va en esta consulta. select * from tableName as tn donde tn.code en sqlFormattedString;

PS: lista de códigos en la lista de parámetros es java.util.List