2011-03-17 26 views
6

Tôi đã bốn bảng, USER, LIÊN HỆ, CONACT_TYPE, và USER_CONTACTHibernate giúp đỡ với một tiêu chí tham gia truy vấn

cửa hàng USER_CONTACT tất cả các địa chỉ liên lạc mà người dùng có bàn dân cư với dữ liệu giả như sau

USER TABLE

USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) | 
------------------------------------------------------------ 
| 1  |  TEST   |  USER   | 
------------------------------------------------------------ 

USER_CONTACT

USER_CONTACT_ID(int) | USER_ID(int) | CONTACT_ID(int) | 
------------------------------------------------------- 
|  1    |  1  |   1  | 
|  2    |  1  |   2  | 
|  3    |  1  |   3  | 
------------------------------------------------------- 

LIÊN HỆ

CONTACT_ID(int) | CONTACT_TYPE_ID(int) | CONTACT(varchar(2)| 
------------------------------------------------------------- 
|  1  |   2    | (555) 555-5555 | 
|  2  |   2    | (555) 593-3938 | 
|  3  |   1    | [email protected] | 
------------------------------------------------------------- 

CONTACT_TYPE

CONTACT_TYPE_ID(int) | CONTACT_TYPE | 
------------------------------------- 
|  1   | EMAIL  | 
|  2   | PHONE  | 
------------------------------------- 

Những gì tôi đang cố gắng làm là tạo ra một truy vấn mà sẽ trở lại một danh sách có chứa chỉ CONACT_TYPE ĐIỆN THOẠI đây là chế độ ngủ đông của tôi chức năng cho đến nay

public List<UserContact> getUserContactByType(Integer userId, String contactType) { 
     Session session = getSessionFactory().openSession(); 

     try { 
      Criteria criteria = session.createCriteria(UserContact.class, "USER_CONACT"); 

      criteria.add(Restrictions.eq("USER_CONACT.userId, userId"); 

      criteria.add(Restrictions.eq("USER_CONTACT.contact.contactType.contactType", contactType); 

      return (List<UserContact>)criteria.list(); 

     } 

} 

Mỗi bảng được ánh xạ tới một lớp mô hình. Thông tin lớp quan trọng như sau.

Contact.java

Có một mối quan hệ @ManyToOne đến lớp ContactType.java

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
private ContactType contactType; 

UserContact.java

Có một mối quan hệ @ManyToOne đến lớp Contact.java và a @ManyToOne trên lớp User.java

@ManyToOne(optional = false, fetch = FetchType.LAZY) 
private Contact contact; 

@ManyToOne(optional = false, fetch = FetchType.LAZY) 
private User user; 

Tất cả các lớp đều có getters và setters chuẩn cho tất cả các thuộc tính cột cho các bảng ở trên.

Tôi tiếp tục nhận được thông báo lỗi rằng nó không thể giải quyết thuộc tính contact.contactType của lớp UserContact của tôi. Bất cứ ai cũng biết làm thế nào để thực hiện đúng một cái gì đó như thế này trong hibernate?

+1

Bạn không thể viết tiêu chí (cũng như HQL) dựa trên bảng. Bạn cần phải cho chúng tôi biết điều gì đó về các lớp học. –

+0

Bạn đã thể hiện các liên hệ người dùng của mình dưới dạng thực thể trong ứng dụng của bạn (nhiều người đến nhiều người một chiều bằng cách sử dụng bảng tham gia). ? –

+0

@Stefan Steinegger Tôi đã cập nhật một số thông tin về các lớp học – medium

Trả lời

7

Tôi đã tìm ra, tôi không biết về hàm createAlias. Giải pháp là dưới đây nếu bất cứ ai đang tự hỏi.

public List<UserContact> getUserContactByType(Integer userId, String contactType) { 
     Session session = getSessionFactory().openSession(); 

     try { 
      Criteria criteria = session.createCriteria(UserContact.class, "USER_CONACT"); 

      criteria.add(Restrictions.eq("USER_CONACT.userId, userId"); 

      criteria.createAlias("USER_CONACT.contact", "c"); 

      criteria.add(Restrictions.eq("c.contactType.contactType", contactType); 

      return (List<UserContact>)criteria.list(); 

     } 

} 
+0

Cảm ơn, điều này đã làm việc cho tôi. –

+1

Vui lòng sửa tham số row ... 'userId' phải nằm ngoài ký hiệu' "'. Chính xác - 'criteria.add (Restrictions.eq (" USER_CONACT.userId ", userId);' –

0

Bây giờ bạn có thể sử dụng Spring-Data-JPA với hỗ trợ QueryDSL!

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