2011-03-17 14 views
6

Tengo cuatro mesas, USUARIO, contacto, CONACT_TYPE y USER_CONTACTHibernate ayuda con un criterio de consulta de unión

USER_CONTACT almacena todos los contactos que un usuario tiene mesas pobladas con datos ficticios son los siguientes

TABLA DE USUARIO

USER_ID(int)| FIRST_NAME(varchar(2) | LAST_NAME(varchar(2) | 
------------------------------------------------------------ 
| 1  |  TEST   |  USER   | 
------------------------------------------------------------ 

USER_CONTACT

USER_CONTACT_ID(int) | USER_ID(int) | CONTACT_ID(int) | 
------------------------------------------------------- 
|  1    |  1  |   1  | 
|  2    |  1  |   2  | 
|  3    |  1  |   3  | 
------------------------------------------------------- 

CONTACTAR

CONTACT_ID(int) | CONTACT_TYPE_ID(int) | CONTACT(varchar(2)| 
------------------------------------------------------------- 
|  1  |   2    | (555) 555-5555 | 
|  2  |   2    | (555) 593-3938 | 
|  3  |   1    | [email protected] | 
------------------------------------------------------------- 

CONTACT_TYPE

CONTACT_TYPE_ID(int) | CONTACT_TYPE | 
------------------------------------- 
|  1   | EMAIL  | 
|  2   | PHONE  | 
------------------------------------- 

Lo que estoy tratando de hacer es crear una consulta que devolverá una lista que tiene sólo contiene el CONACT_TYPE teléfono aquí es mi hibernación función hasta ahora

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

     } 

} 

Cada tabla está asignada a una clase de modelo. La información importante de la clase es la siguiente.

Contact.java

Contiene una relación @ManyToOne a clase ContactType.java

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
private ContactType contactType; 

UserContact.java

Contiene una relación @ManyToOne a clase y Contact.java un @ManyToOne en la clase User.java

@ManyToOne(optional = false, fetch = FetchType.LAZY) 
private Contact contact; 

@ManyToOne(optional = false, fetch = FetchType.LAZY) 
private User user; 

Todas las clases tienen los getters y setters estándar para todos los atributos de columna para las tablas anteriores también.

Sigo recibiendo un error que indica que no puede resolver la propiedad contact.contactType de mi clase UserContact. ¿Alguien sabe cómo ejecutar correctamente algo así en Hibernate?

+1

No puede escribir criterios (ni HQL) basados ​​en tablas. Necesitas decirnos algo sobre las clases. –

+0

¿Ha expresado sus contactos de usuario como entidad en su aplicación (muchos a muchos unidireccionales usando la tabla de unión). ? –

+0

@Stefan Steinegger He actualizado con información sobre las clases – medium

Respuesta

7

Lo descubrí, no conocía la función createAlias. La solución está abajo si alguien se está preguntando.

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

     } 

} 
+0

Gracias, esto funcionó para mí. –

+1

Por favor, arregle la fila ... el parámetro 'userId' debe estar fuera del símbolo' "'. Corregir uno - 'criteria.add (Restrictions.eq (" USER_CONACT.userId ", userId);' –

0

Ahora puede utilizar Spring-Data-JPA con soporte QueryDSL.

Cuestiones relacionadas