Hibernate帮助使用criteria进行连接查询

6
我有四个表,USER(用户)、CONTACT(联系人)、CONACT_TYPE(联系类型)和USER_CONTACT(用户联系人)。
USER_CONTACT 存储了用户拥有的所有联系人信息,填充虚拟数据的表如下: USER TABLE(用户表)
USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) |
------------------------------------------------------------
|    1      |       TEST            |       USER           |
------------------------------------------------------------

用户联系方式
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_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();

      }

}

每个表都映射到一个模型类。重要的类信息如下所示。

Contact.java

包含对ContactType.java类的@ManyToOne关系。
@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;

所有的类都有标准的getter和setter,用于上述表格中所有列属性。
我一直收到一个错误,称无法解析我的UserContact类中contact.contactType属性。有人知道如何在Hibernate中正确执行这样的操作吗?

1
你不能基于表格编写条件(也不能使用HQL)。你需要告诉我们有关类的一些信息。 - Stefan Steinegger
你是否将用户联系人(多对多单向使用连接表)表达为应用程序中的实体? - uncaught_exceptions
@Stefan Steinegger 我更新了一些有关类的信息。 - medium
@doc_180,我也这么认为。虽然我很新手hibernate,但我已经确认类映射是正确的。我认为是我对HQL语言的了解不足,导致我无法理解如何解决这个问题。 - medium
2个回答

7

我弄清楚了,我之前不知道有一个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();

      }

}

1
请修复行...参数userId应该在"符号之外。 正确的写法 - criteria.add(Restrictions.eq("USER_CONACT.userId", userId); - svichkar

0

现在你可以使用支持QueryDSL的Spring-Data-JPA了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接