我有四个表,USER,CONTACT,CONACT_TYPE和USER_CONTACT
USER_CONTACT存储用户具有填充虚拟数据的表的所有联系人,如下所示
用户表
USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) |
------------------------------------------------------------
| 1 | TEST | USER |
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
USER_CONTACT
USER_CONTACT_ID(int) | USER_ID(int) | CONTACT_ID(int) |
-------------------------------------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
-------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
联系
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 |
-------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
CONTACT_TYPE
CONTACT_TYPE_ID(int) | CONTACT_TYPE |
-------------------------------------
| 1 | EMAIL |
| 2 | PHONE |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
我要做的是创建一个查询,返回一个只包含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();
}
}
Run Code Online (Sandbox Code Playgroud)
每个表都映射到一个模型类.重要的班级信息如下.
Contact.java
包含与ContactType.java类的@ManyToOne关系
@ManyToOne(optional = false, fetch = FetchType.EAGER)
private ContactType contactType;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
所有类都具有上表中所有列属性的标准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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11668 次 |
| 最近记录: |