Hibernate帮助和条件联接查询

Hibernate帮助和条件联接查询,hibernate,Hibernate,我有四个表,用户、联系人、联系人类型和用户联系人 USER_CONTACT存储用户表中填充了虚拟数据的所有联系人,如下所示 用户表 USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) | ------------------------------------------------------------ | 1 | TEST | USER | -

我有四个表,用户、联系人、联系人类型和用户联系人

USER_CONTACT存储用户表中填充了虚拟数据的所有联系人,如下所示

用户表

USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) |
------------------------------------------------------------
|    1      |       TEST            |       USER           |
------------------------------------------------------------
CONTACT_TYPE_ID(int) | CONTACT_TYPE | 
-------------------------------------
|       1            |   EMAIL      | 
|       2            |   PHONE      | 
-------------------------------------
用户联系方式

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  | 
-------------------------------------------------------------
联系方式

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  | 
-------------------------------------------------------------
联系人类型

USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) |
------------------------------------------------------------
|    1      |       TEST            |       USER           |
------------------------------------------------------------
CONTACT_TYPE_ID(int) | CONTACT_TYPE | 
-------------------------------------
|       1            |   EMAIL      | 
|       2            |   PHONE      | 
-------------------------------------
我要做的是创建一个查询,它将返回一个只包含电话连接类型的列表。这里是我的hibernate函数

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

      }

}
UserContact.java

包含与Contact.java类的@ManyToOne关系和User.java类上的@ManyToOne

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

@ManyToOne(optional = false, fetch = FetchType.LAZY)
private User user;
所有的类对于上面表的所有列属性都有标准的getter和setter


我不断收到一个错误,指出它无法解析我的UserContact类的属性contact.contactType。有人知道如何在hibernate中正确执行类似的操作吗?

我知道了,我不知道有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();

      }

}
public List getUserContactByType(整数用户ID,字符串contactType){
会话会话=getSessionFactory().openSession();
试一试{
Criteria=session.createCriteria(UserContact.class,“USER_CONACT”);
添加(Restrictions.eq(“USER_CONACT.userId,userId”);
标准.createAlias(“用户联系人”,“c”);
标准。添加(限制。等式(“c.contactType.contactType”,contactType);
返回(列表)条件。列表();
}
}

现在您可以使用支持QueryDSL的Spring数据JPA!

您不能基于表编写标准(或HQL)。您需要告诉我们一些关于类的信息。您是否在应用程序中将用户联系人表示为实体。(使用联接表进行多对多单向).?@Stefan Steinegger我已经更新了一些关于classes@doc_180,我想是的。我对hibernate非常陌生,但是我已经被保证类映射是正确的。我认为是我对HQL语言缺乏知识,这妨碍了我理解如何解决这个问题。请修复行…参数
userId
应该在
符号之外。更正一个-
标准。添加(Restrictions.eq(“USER\u CONACT.userId”,userId);