2011-03-17 14 views
6

Mam cztery tabele, USER, kontakt, CONACT_TYPE i USER_CONTACTHibernate pomocy z kryteriami dołączyć zapytanie

USER_CONTACT przechowuje wszystkie kontakty, które użytkownik ma stoliki zapełnione danymi atrapy są następujące

USER TABELA

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  | 
------------------------------------------------------- 

SKONTAKTUJ

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  | 
------------------------------------- 

Co staram się zrobić, to utworzyć kwerendę, która zwraca listę, która ma zawierać tylko CONACT_TYPE PHONE tutaj jest mój hibernacji funkcja do tej pory

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(); 

     } 

} 

Każda tabela jest odwzorowana na klasę modelu. Ważne informacje o klasie są następujące.

Contact.java

Zawiera relację @ManyToOne do klasy ContactType.java

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

UserContact.java

zawiera związek @ManyToOne do klasy Contact.java i a @ManyToOne na stronie User.java

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

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

Wszystkie klasy mają standardowe procedury pobierające i ustawiające dla wszystkich atrybutów kolumn dla powyższych tabel również.

Ciągle pojawia się błąd stwierdzający, że nie może on rozwiązać właściwości contact.contactType mojej klasy UserContact. Ktoś wie, jak poprawnie wykonać coś takiego w hibernacji?

+1

Nie można pisać kryteriów (ani HQL) na podstawie tabel. Musisz nam coś powiedzieć o zajęciach. –

+0

Czy wyraził (a) Pan (i) kontakty użytkownika jako encję w swojej aplikacji (wiele do wielu jednokierunkowych przy użyciu tabeli sprzężenia). ? –

+0

@Stefan Steinegger Zaktualizowałem niektóre informacje o klasach – medium

Odpowiedz

7

Wyjaśniałem to, nie wiedziałem o funkcji createAlias. Rozwiązanie jest poniżej, jeśli ktoś się zastanawia.

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

Dzięki, to zadziałało dla mnie. –

+1

Proszę poprawić wiersz ... parametr 'userId' powinien znajdować się poza symbolem' ''. Popraw to - "kryteria.add (Ograniczenia.eq (" USER_CONACT.userId ", userId);' –

0

Teraz możesz użyć Spring-Data-JPA z obsługą QueryDSL!

Powiązane problemy