Справка Hibernate с запросом присоединения критериев - PullRequest
6 голосов
/ 17 марта 2011

У меня есть четыре таблицы: USER, CONTACT, CONACT_TYPE и USER_CONTACT

USER_CONTACT хранит все контакты, таблицы которых у пользователя заполнены фиктивными данными:

ТАБЛИЦА ПОЛЬЗОВАТЕЛЯ

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

КОНТАКТ

CONTACT_ID(int) |  CONTACT_TYPE_ID(int) | CONTACT(varchar(2)|
-------------------------------------------------------------
|      1        |         2             |  (555) 555-5555   |
|      2        |         2             |  (555) 593-3938   |
|      3        |         1             |  test@oracle.com  | 
-------------------------------------------------------------

CONTACT_TYPE

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

То, что я пытаюсь сделать, - это создать запрос, который будет возвращать список, содержащий только PHONE CONACT_TYPE, здесь моя функция гибернации до сих пор

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

      }

}

Каждая таблица сопоставлена ​​с классом модели. Важная информация о классе выглядит следующим образом.

Contact.java

Содержит отношение @ManyToOne к классу ContactType.java

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

UserContact.java

Содержит отношение @ManyToOne к классу Contact.java и @ManyToOne для класса User.java

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

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

Все классы имеют стандартные методы получения и установки для всех атрибутов столбцов для таблиц выше.

Я получаю сообщение об ошибке, утверждающее, что он не может разрешить свойство contact.contactType моего класса UserContact. Кто-нибудь знает, как правильно выполнить нечто подобное в спящем режиме?

Ответы [ 2 ]

7 голосов
/ 17 марта 2011

Я понял это, я не знал о функции createAlias. Решение ниже, если кому-то интересно.

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 голосов
/ 16 августа 2017

Теперь вы можете использовать Spring-Data-JPA с поддержкой QueryDSL!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...