Cách viết HQL trong truy vấn (…) đúng cách


80

Giả sử rằng tôi muốn viết truy vấn HQL sau:

FROM Cat c WHERE c.id IN (1,2,3)

cách thích hợp để viết điều này dưới dạng một truy vấn được tham số hóa, ví dụ:

FROM Cat c WHERE c.id IN (?)

Câu trả lời:


130

Tôi không chắc làm thế nào để thực hiện việc này với tham số vị trí, nhưng nếu bạn có thể sử dụng tham số được đặt tên thay vì tham số vị trí, thì tham số được đặt tên có thể được đặt bên trong dấu ngoặc và phương thức setParameterList từ giao diện truy vấn có thể được sử dụng để liên kết danh sách giá trị với tham số này.

...
Query query = session.createQuery("FROM Cat c WHERE c.id IN (:ids)");
query.setParameterList("ids", listOfIds);
...

11

Các phiên bản cũ hơn của Hibernate có thể không bật setParameterListphương pháp này Query. Bạn vẫn có thể gọi setParameter("ids", listOfIds);cái cũ hơn để có hiệu quả tương tự.


5
Tại sao điều này vẫn được thay đổi? Chỉ dành một giờ để tìm ra lý do tại sao IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))lại xảy ra. Tôi đã gọi setParameterthay vì setParameterList. DOH!
opncow

-4

Tham số được đặt tên tốt hơn tham số vị trí, chúng ta nên cẩn thận trong việc xem xét thứ tự / vị trí - trong khi được đặt tên thì dễ dàng.

Đặt tên:

Query query = session.createQuery("select count(*) from User"+" where userName=:userName and passWord=:passWord");
        query.setString("userName", userName);
        query.setString("passWord", passWord);

Vị trí:

Query query=em.createQuery("SELECT e FROM Employee e WHERE e.empId = ? and  e.empDepartment = ?");
query.setParameter(1, employeId);
query.setParameter(2, empDepartment);

3
Hoàn toàn đồng ý, nhưng điều đó không trả lời câu hỏi của tôi về IN (...) truy vấn
Robert Munteanu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.