2009-11-18 4 views
9

Ich habe für das ganze eine Abfrage versucht, die mir offiziell Albträume gibt. Das System ist ein Benutzer- und Kontaktmanagement. So habe ich UserAccount, Contact und Phone.HQL mit einer Sammlung in der WHERE-Klausel

UserAccount hat eine bidirektionale Eins-zu-viele-Beziehung mit Contact und einem unidirektionalen eines am Telefon alle von einem Set abgebildet:

//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>(); 

Kontakt hat jetzt eine Eins-zu-viele unidirektionale mit Telefonen

@OneToMany(targetEntity=PhoneImpl.class, cascade={CascadeType.ALL}) 
private Set<Phone> phones = new HashSet<Phone>(); 

Ich schreibe eine Methode, um die Existenz der gleichen Nummer für den gleichen Kontakt eines bestimmten Benutzers durch die E-Mail eindeutige Feld zu überprüfen.

Ich weiß, ich hätte die equals und hashcode dafür übersteuern können, aber seit Telefon in einer Entity von Set zugeordnet Ich weiß nicht in diesem Moment, wie das geht.

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]. 

Ich kann nicht wirklich herausfinden: Also ich eine Methode eher zu prüfen für diese Einzigartigkeit für mich vor jedem Eintrag auf der Kontaktseite

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; 
} 

Ich halte auf, die diese Fehler liefern wollte was passiert, und zuerst ich nicht weiß, wie man für das Lesen

Antwort

16

HQL-Abfrage in dieser Richtung wäre wahrscheinlich etwas Sammlungen in HSQ.thanks zu behandeln:

 
select c 
from Contact c 
join c.phones cphones 
where c.userAccount.email = :email 
    and cphones.formatedNumber = :number 

Auch Sie möchten vielleicht Ergebnisse der Abfrage wie folgt behandeln. Die list() Methode gibt immer eine Liste, niemals eine Null zurück.

return !result.isEmpty(); 
+0

oder 'Rückkehr result.isEmpty();!' ;) –

+0

@ framer8, fest –