2011-06-08 66 views
20

Tôi biết tôi có thể chuyển danh sách tới truy vấn được đặt tên trong JPA, nhưng làm thế nào về NamedNativeQuery? Tôi đã thử nhiều cách nhưng vẫn không thể chuyển danh sách tới NamedNativeQuery. Bất cứ ai cũng biết cách chuyển danh sách tới mệnh đề in trong NamedNativeQuery? Cảm ơn nhiều!Danh sách chuyển qua JPA tới mệnh đề IN trong truy vấn gốc có tên

Các NamedNativeQuery như sau:

@NamedNativeQuery(
    name="User.findByUserIdList", 
    query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?userIdList)" 
) 

và nó được gọi như thế này:

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

Tuy nhiên kết quả là không như tôi mong đợi.

System.out.println(userList.size()); //output 1 

Object[] user = userList.get(0); 
System.out.println(user.length); //expected 5 but result is 3 
System.out.println(user[0]);  //output MDAVERSION which is not a user_id 
System.out.println(user[1]);  //output 5 
System.out.println(user[2]);  //output 7 
+0

Bạn đã thử thực hiện chính xác cùng một truy vấn bằng ứng dụng khách DB của mình chưa? –

Trả lời

14

Danh sách không phải là tham số hợp lệ cho truy vấn SQL gốc, vì nó không thể bị ràng buộc trong JDBC. Bạn cần phải có một tham số cho mỗi đối số trong danh sách.

nơi u.user_id trong (? Id1,? Id2)

này được hỗ trợ thông qua JPQL, nhưng không phải SQL, vì vậy bạn có thể sử dụng JPQL thay vì một truy vấn nguồn gốc.

Một số nhà cung cấp JPA có thể hỗ trợ điều này, vì vậy bạn có thể muốn đăng nhập lỗi với nhà cung cấp của mình.

+3

Câu hỏi ... – SoftwareSavant

1

Đã thử trong JPA2 với Hibernate là nhà cung cấp và có vẻ như hỗ trợ ngủ đông trong danh sách cho "IN" và hoạt động. (Ít nhất là đối với các truy vấn được đặt tên và tôi tin rằng nó sẽ tương tự với các truy vấn NATIVE được đặt tên) Nội bộ ngủ đông nào tạo ra các tham số động, bên trong IN giống như số phần tử trong danh sách được truyền trong danh sách.

Vì vậy, trong bạn ví dụ trên

List<Object[]> userList = em.createNamedQuery("User.findByUserIdList").setParameter("userIdList", list).getResultList(); 

Nếu danh sách có 2 yếu tố truy vấn sẽ trông giống như

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?) 

và nếu nó có 3 yếu tố có vẻ như

select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
     "where u.user_id in (?, ?, ?) 
-1

Bạn có thể thử số này : userIdList thay vì (? UserIdList)

@NamedNativeQuery(
     name="User.findByUserIdList", 
     query="select u.user_id, u.dob, u.name, u.sex, u.address from user u "+ 
      "where u.user_id in :userIdList" 
) 
0

Tùy thuộc vào cơ sở dữ liệu của bạn/nhà cung cấp/driver/etc., Bạn có thể, trên thực tế, thông qua một danh sách như một tham số ràng buộc để một truy vấn nguồn gốc JPA.

Ví dụ, với Postgres và EclipseLink, các công trình sau (trả về true), thể hiện các mảng đa chiều và cách lấy một mảng có độ chính xác kép. (Do SELECT pg_type.* FROM pg_catalog.pg_type với nhiều loại khác;. Có lẽ là những người thân với _, nhưng dải nó đi trước khi sử dụng nó)

Array test = entityManager.unwrap(Connection.class).createArrayOf("float8", new Double[][] { { 1.0, 2.5 }, { 4.1, 5.0 } }); 
Object result = entityManager.createNativeQuery("SELECT ARRAY[[CAST(1.0 as double precision), 2.5],[4.1, 5.0]] = ?").setParameter(1, test).getSingleResult(); 

Dàn diễn viên là có rất mảng đen là của đôi chứ không phải là số.

Thêm vào điểm của câu hỏi - Tôi không biết cách hoặc bạn có thể thực hiện truy vấn được đặt tên; Tôi nghĩ rằng nó phụ thuộc, có thể. Nhưng tôi nghĩ rằng sau đây sẽ làm việc cho các công cụ Array.

Array list = entityManager.unwrap(Connection.class).createArrayOf("int8", arrayOfUserIds); 
List<Object[]> userList = entityManager.createNativeQuery("select u.* from user u "+ 
    "where u.user_id = ANY(?)") 
    .setParameter(1, list) 
    .getResultList(); 

tôi không có sơ đồ tương tự như OP, vì vậy tôi đã không kiểm tra này chính xác, nhưng tôi nghĩ rằng nó nên làm việc - một lần nữa, ít nhất là trên Postgres & EclipseLink.

Ngoài ra, khóa được tìm thấy trong: http://tonaconsulting.com/postgres-and-multi-dimensions-arrays-in-jdbc/

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