2011-01-28 3 views
5

Я попытался построить динамический запрос с использованием CriteriaBuilder в JPA 2.0. Мое приложение - Spring 3.0, Hibernate 3.6.0 + JPA 2.0. На самом деле у меня есть два объекта, один является taUser и еще один taContact, в моем taUser классе имеет одно свойство, которое имеет много к одному отношения с taContact мои классы POJO являются (например, образец)Как построить динамический запрос для отношения «многие к одному» с использованием CriteriaBuilder 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; 
    } 

    } 

и мой ОРМ .xml

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

Как я могу создать построения динамического запроса с использованием критериев на самом деле это мой jpql запрос я хочу, чтобы изменить его в построении динамического запроса с использованием критериев.

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

Как я могу проверить второе условие?

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) 

как я могу решить эту проблему?

ответ

-1

Существует много примеров использования динамического запроса в JPA EntityManagerFactory.

  1. Если вы используете JPA Entity класс и использование Hibernate 3 JPA аннотаций, то вы можете определить запрос с использованием @NamedQuery аннотацию.

  2. Вы можете использовать javax.persistence.Query для создания динамического запроса.

    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. Вы можете использовать API-интерфейс Hibernate.

Но дело в том, что если вы хотите создать критерии, вам необходимо инициализировать объект сеанса. Итак, чтобы получить объект сеанса, используйте объект управления сущностью.

+2

пожалуйста: если английский не является вашим родным языком, это нормально. Но постарайтесь не делать все хуже, написав LOL-talk, как «u», а не «вы». Кроме того, старайтесь не пропускать классы, пакеты и технологии, о которых вы говорите. Ваше сообщение достаточно сложно читать, как есть. –

+0

Я попытался исправить ваш пост, но даже в этом случае ваш ответ не имеет значения, поскольку вопрос касается API JPA 2 Criteria, а не API-схемы Hibernate. –

+0

Привет, Шон Патрик Флойд, ваш второй комментарий прав. Чем, почему вы не можете дать мне какое-либо предложение? –

13

Я предполагаю, что это способ сделать это:

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

BTW, 8971329902 является способ большим для int поля. Установите тип поля long.

+1

большое спасибо. спас мой день: D – superbly

Смежные вопросы