我一直在为整个查询尝试正式向我做噩梦的查询。该系统是用户和联系人管理。所以我有UserAccount,Contact和Phone。
UserAccount
Contact
Phone
UserAccount与Contact手机具有双向一对多关系,并且在电话上具有单向关系,所有关系均由映射Set:
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>();
我正在编写一种方法,通过电子邮件唯一字段来检查特定用户的同一联系人是否存在相同号码。
我知道我可以为此而覆盖equalsand hashcode,但是由于电话是按set映射的实体,因此我现在不知道该怎么做。因此,我想提供一种方法来在联系页面上的每个条目输入之前为我检查该唯一性
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中的集合。感谢阅读
HQL查询可能与以下几行相似:
选择c 来自联系人c 加入c.phones cphones 其中c.userAccount.email =:email 和cphones.formatedNumber =:number
另外,您可能想要处理这样的查询结果。该 列表() 方法返回总是一个列表,从来没有空。
return !result.isEmpty();