Hibernate帮助标准连接查询

时间:2011-03-17 12:30:02

标签: hibernate

我有四个表,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

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的List,这是我的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

包含与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中正确执行这样的事情吗?

2 个答案:

答案 0 :(得分: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 :(得分:0)

现在您可以使用Spring-Data-JPA和QueryDSL支持!