2009-11-18 15 views
9

He estado tratando de hacer una consulta que oficialmente me está dando pesadillas. El sistema es un usuario y gestión de contactos. Entonces tengo UserAccount, Contact y Phone.HQL con una colección en la cláusula WHERE

UserAccount tiene una relación bidireccional uno-a-muchos con Contact y uno unidireccional en el teléfono todo el mapeado por un 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>(); 

Contacto ahora tiene un uno-a-muchos unidireccional con los teléfonos

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

Estoy escribiendo un método para verificar la existencia del mismo número para el mismo contacto de un usuario particular por el campo único de correo electrónico.

Sé que podría haber anulado el equals y hashcode para eso, pero desde el teléfono en una entidad mapeada por el conjunto, no sé en este momento cómo hacerlo. Así que quería proporcionar un método para comprobar que en lugar de unicidad para mí antes de cada entrada en la página de contacto

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

sigo teniendo este error:

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

Realmente no puedo averiguar lo que sucede y la primera no sé cómo tratar colecciones en HSQ.thanks para leer

consulta

Respuesta

16

HQL sería probablemente algo como lo siguiente:

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

También es posible que desee manejar los resultados de una consulta como esta. El método list() devuelve siempre una lista, nunca un nulo.

return !result.isEmpty(); 
+0

o 'volver result.isEmpty();!' ;) –

+0

@ framer8, fijo –