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?
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?
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!
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
)
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.
Nhận lỗi "Không có chữ ký của phương thức creteateQuery()" – n92
@vinay, đăng mã lỗi và stacktrace trong câu hỏi bằng cách chỉnh sửa – hvgotcodes
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();
}
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);
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
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!
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
bạn đang sử dụng gì để xây dựng sql của bạn? – hvgotcodes
Hql executQuery() – n92