2011-08-17 38 views
6

tôi có các giá trị (1, 2, 3, ví dụ), và tôi muốn vượt qua danh sách đó để một truy vấn SQL:Làm thế nào để vượt qua List trong sql query

"select name from tbl where id in" + list 

Làm thế nào tôi có thể đạt được điều này?

+0

bạn đang sử dụng gì để xây dựng sql của bạn? – hvgotcodes

+0

Hql executQuery() – n92

Trả lời

0

Cú pháp SQL là:

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

Tất cả bạn phải làm là xây dựng dấu phẩy tách ra danh sách các mục và chèn nó trong chuỗi.

Cảnh báo xây dựng chuỗi sql bắt buộc: không!

0

Vượt qua danh sách dưới dạng danh sách được phân cách bằng dấu phẩy và sử dụng hàm tách để chia thành danh sách biến tạm thời.

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

Nói về săn thỏ với vũ khí chiến thuật ... Hoặc sử dụng máy chủ báo cáo của Microsoft, điều tương tự về cơ bản. – Blindy

+0

Tôi nghĩ rằng tôi đã hiểu nhầm câu hỏi là "làm cách nào để chuyển danh sách này vào một thủ tục được lưu trữ". Lỗi của tôi. – RKeast

0

tùy thuộc vào cách bạn đang xây dựng sql của mình. Nếu bạn đang xây dựng nó cho mình (ý tưởng tồi), bạn cần phải làm làm cho cái nhìn sql như -

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

Vì trong bình luận của bạn bạn chỉ định Hibernate HQL, một cái gì đó giống như -

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

sẽ nhận được bạn đã bắt đầu. Lưu ý User là tên của đối tượng bạn đã ánh xạ tới bảng bạn muốn truy vấn.

+0

Nhận lỗi "Không có chữ ký của phương thức creteateQuery()" – n92

+0

@vinay, đăng mã lỗi và stacktrace trong câu hỏi bằng cách chỉnh sửa – hvgotcodes

-1

Chuỗi sqlQuery = "chọn tên từ tbl trong đó id trong" + sqlFormatedList (danh sách);

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

bây giờ tôi nhận được [1,2,3] là (123), do đó làm thế nào để có dấu phẩy tách chuỗi, tôi đang so sánh với id, id là số nguyên nhưng "sb" là chuỗi, do đó, làm thế nào để làm cho nó – n92

+0

Xin lỗi tôi sẽ sửa chữa nó cho bạn 1 phút, vì vậy cố định. – Farmor

5

bạn cần phải đặt danh sách của bạn trực tiếp đến tuyên bố sql

dụ:

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

Với Java 8, bạn có thể sử dụng 'String.join (", ", list)', tuy nhiên giải pháp này không phù hợp với tham số String. – Pino

3

tôi thấy trong bài trả lời của bạn đến một bình luận mà bạn đang sử dụng HQL. Nếu đó là trường hợp, các folks Hibernate làm này dễ dàng cho bạn, trong truy vấn, chỉ cần chỉ định:

where id in (:ids) 

và sau đó sử dụng setParameterList("ids", list) qua danh sách của bạn. Hibernate sẽ làm tất cả việc mở rộng cho bạn!

0

Tôi đã thử giải pháp được cung cấp bởi Farmour. Công việc & đơn giản, hiệu quả của nó. Tôi đã sửa đổi nó một chút theo nhu cầu của tôi ... & cũng đã thử gỡ lỗi để đảm bảo định dạng chính xác theo cách tôi muốn.

chuỗi tĩnh công khai 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(); 
} 

Phân tích ngắn gọn: Input Params: [ABC, MNP, XYZ], như Danh sách Strings định dạng Java

Output: ('ABC' , 'MNP', 'XYZ'), như Chuỗi được sử dụng trong truy vấn SQL.

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

Chuỗi o/p này nằm trong truy vấn này. chọn * từ tableName là tn nơi tn.code trong sqlFormattedString;

PS: codeList trong Danh sách tham số là java.util.List

Các vấn đề liên quan