我一直在尝试这个正式给我做恶梦的查询。该系统是用户和联系人管理。我有UserAccount
,Contact
和Phone
。
UserAccount
与Contact
具有双向一对多关系,而且电话上的单向关系全部由Set
映射:
//UserAccount mapping
@OneToMany(targetEntity=PhoneImpl.class, cascade= {CascadeType.ALL})
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Phone> phones = new HashSet<Phone>();
@OneToMany(targetEntity=ContactImpl.class, cascade={CascadeType.ALL}, mappedBy="userAccount")
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Contact> contacts = new HashSet<Contact>();
现在联系人有一对多的单向电话
@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL})
private Set<Phone> phones = new HashSet<Phone>();
我正在编写一种方法,通过电子邮件唯一字段检查特定用户的同一联系人是否存在相同的号码。
我知道我可以为equals
和hashcode
覆盖,但由于手机映射的实体中的电话我目前不知道如何做到这一点。因此,我希望在联系页面上的每个条目之前提供一种方法来检查我的唯一性
public boolean checkForExistingPhone(String userEmail, String formatedNumber) {
List<Contact> result = null;
Session sess = getDBSession().getSession();
String query = "select Contact ,cphones.formatedNumber from Contact c inner join Contact.phones cphones where c.UserAccount.email = :email and cphones.formatedNumber= :number";
// try {
result = (List<Contact>) sess.createQuery(query)
.setParameter("email", userEmail)
.setParameter("number", formatedNumber).list();
// } catch (HibernateException hibernateException) {
// logger.error("Error while fetching contacts of email " + userEmail + " Details:" + hibernateException.getMessage());
// }
if(result == null)
return false;
else
return true;
}
我一直有这个错误:
org.hibernate.hql.ast.QuerySyntaxException: Contact is not mapped [select
cphones.formatedNumber from Contact c inner join Contact.phones cphones where
c.UserAccount.email = :email and cphones.formatedNumber= :number].
我无法弄清楚会发生什么,首先我不知道如何处理HSQ.thanks中的集合进行阅读
答案 0 :(得分:16)
HQL查询可能就是这些问题:
select c from Contact c join c.phones cphones where c.userAccount.email = :email and cphones.formatedNumber = :number
此外,您可能希望像这样处理查询结果。 list()方法始终返回一个列表,而不是null。
return !result.isEmpty();