2011-01-28 10 views
5

JPA 2.0のCriteriaBuilderを使用して動的クエリを構築しました。私のアプリケーションはSpring 3.0、Hibernate 3.6.0 + JPA 2.0ベースです。実は私は1つがtaUserある2つのエンティティを持っているし、別の1は私のtaUserクラスで、taContactあることtaContactとの一対一の関係に多くを持っている一つの特性を、持っている私のPOJOクラス(サンプル例)JPA 2.0のCriteriaBuilderを使用して多対1リレーションシップの動的クエリを構築する方法

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

    } 

と私のORMの.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> 

はどのような基準を使用して動的なクエリを構築することは、実際にこれは私がのcriteriasを使用して動的なクエリを構築するにそれを変更したい私のJPQLクエリで作成することができます。

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

どのように2番目の状態を確認できますか?

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で使用するには、多くの威力があります。あなたはJPA Entityクラスと使用Hibernateは3 JPA注釈を使用している場合

  1. は、あなたは@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. Hibernate Criteria APIを使用できます。

ただし、条件を作成したい場合は、セッションオブジェクトを初期化する必要があります。セッションオブジェクトを取得するには、エンティティマネージャオブジェクトを使用します。

+2

お願い:英語が母国語でない場合は問題ありません。しかし、LOLを書くことですべてを悪化させないようにしてください。「あなた」の代わりに「u」のように話してください。また、あなたが参照するクラス、パッケージ、テクノロジーのスペルを間違えないようにしてください。あなたの投稿はそのまま読むのが難しいです。 –

+0

あなたの投稿を修正しようとしましたが、その答えは無関係です。なぜなら、質問はJPA 2 Criteria APIであり、Hibernate Criteria APIに関するものではないからです。 –

+0

こんにちはショーンパトリックフロイド、2番目のコメントは正しいです。あなたは私に何か提案を与えることができないのですか? –

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

ところで、8971329902はintフィールドのため大への道です。フィールドタイプをlongに設定します。

+1

ありがとうございました。私の一日を救った:D – superbly

関連する問題