2011-01-28 18 views
5

Trabajé construyendo una consulta dinámica utilizando el CriteriaBuilder en JPA 2.0. Mi aplicación es Spring 3.0, Hibernate 3.6.0 + JPA 2.0. En realidad tengo dos entidades es una taUser y otra es taContact, en mi clase taUser tiene una propiedad, que tiene muchos a uno con relación taContact mis clases POJO son (ejemplo muestra)cómo construir una consulta dinámica para una relación muchos a uno utilizando el CriteriaBuilder de JPA 2.0

public class TaUser implements java.io.Serializable { 
    private int userId; 
    private TaContact taContact; 
    public int getUserId() { 
     return this.userId; 
    } 

    public void setUserId(int userId) { 
     this.userId = userId; 
    } 
    public TaContact getTaContact() { 
     return taContact; 
    } 

    public void setTaContact(TaContact taContact) { 
     this.taContact = taContact; 
    } 

    } 


    public class TaContact implements java.io.Serializable { 

    private int contactId; 

    public int getContactId() { 
     return this.contactId; 
    } 

    public void setContactId(int contactId) { 
     this.contactId = contactId; 
    } 
    private int contactNumber; 

    public int getContactNumber() { 
     return contactNumber; 
    } 

    public void setContactNumber(int contactNumber) { 
     this.contactNumber = contactNumber; 
    } 

    } 

y mi .xml ORM

<entity class="com.common.model.TaUser" name="TaUser"> 
     <table name="ta_user" /> 
     <attributes> 
      <id name="userId"> 
       <column name="USER_ID" /> 
       <generated-value strategy="AUTO" /> 
      </id> 
      <many-to-one name="taContact" 
       target-entity="TaContact"> 
       <join-column name="Contact_id" /> 
      </many-to-one> 
</attributes> 
</entity> 

¿Cómo puedo crear la construcción de una consulta dinámica utilizando criterios de hecho este es mi consulta JPQL quiero cambiar en la construcción de una consulta dinámica utilizando criterios.

String jpql = 
    "select * from Tauser user where user.userId = "1" and user.taContact.contactNumber="8971329902"; 

¿Cómo puedo verificar el segundo estado?

user.taContact.contactNumber = "8971329902"

Root<T> rootEntity; 
     TypedQuery<T> typedQuery = null; 
     EntityManagerFactory entityManagerFactory = this.getJpaTemplate() 
       .getEntityManagerFactory(); 
     CriteriaBuilder criteriaBuilder = entityManagerFactory 
       .getCriteriaBuilder(); 
     CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(TaUser.class); 
       rootEntity = criteriaQuery.from(TaUser.class); 
       criteriaQuery.where(criteriaBuilder.equal(rootEntity.get("userId"), 
       "1")); 
     criteriaQuery.where(criteriaBuilder.equal(rootEntity.get("taContact.contactNumber"), 
     "8971329902")); --- here i m getting error 
    at 

org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:110) 
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:218) 
    at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:189) 
    at com.evolvus.core.common.dao.CommonDao.findByCriteria(CommonDao.java:155) 

cómo puedo solucionar esto?

Respuesta

-1

Hay muchos wey para usar esa consulta dinámica en una JPA EntityManagerFactory.

  1. Si utiliza JPA clase de entidad y Uso Hibernate 3 JPA anotaciones a continuación, se puede definir la consulta utilizando la anotación @NamedQuery.

  2. Puede usar javax.persistence.Query para crear una consulta dinámica.

    Query q1=em.createQuery("SELECT TaUser AS tu WHERE tu.userId = :USERID"); 
    //em is entityManager object 
    q1.setInteger("USERID",34); 
    //here 34 is the dynamic value or if there is any relationship with 
    // another entity then set the object reference of the other entity. 
    q1.getResultList(); //return list of data. 
    
  3. Puede utilizar la API de criterios de Hibernate.

Pero la cuestión es que si desea crear criterios, debe inicializar el objeto de la sesión. Entonces, para obtener el objeto de sesión, use el objeto del administrador de la entidad.

+2

por favor: si el inglés no es su lengua materna, está bien. Pero trate de no empeorar las cosas escribiendo LOL-speak como 'u' en lugar de 'usted'. Además, trate de no escribir mal las clases, los paquetes y las tecnologías a las que se refiere. Tu publicación es lo suficientemente difícil de leer como es. –

+0

Traté de corregir su publicación, pero aun así, su respuesta es irrelevante, ya que la pregunta es acerca de la API de criterios de JPA 2, no de la API de criterios de Hibernate. –

+0

Hola Sean Patrick Floyd, tu segundo comentario es correcto. ¿Por qué no puedes darme alguna sugerencia? –

13

supongo que esta es la manera de hacerlo:

public TaUser getUserByIdAndContactNumber(
    final long userId, 
    final long contactNumber){ 

    final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    final CriteriaQuery<TaUser> query = cb.createQuery(TaUser.class); 
    final Root<TaUser> root = query.from(TaUser.class); 
    query 
     .where(cb.and(
      cb.equal(root.get("userId"), userId), 
      cb.equal(root.get("taContact").get("contactNumber"), contactNumber) 
     )); 
    return entityManager.createQuery(query).getSingleResult(); 
} 

Por cierto, es 8971329902 manera de grande para un campo int. Establezca el tipo de campo en long.

+1

muchas gracias. salvó mi día: D – superbly

Cuestiones relacionadas