2011-12-19 2 views
0

私は、Java、Hibernate、またはEntityManagerには一般に慣れていません。私は一種のJava Hiberate EntityManagerを使用した型付き複合基準のクエリ

がReferenceCodeMetaDataのすべてのインスタンスを取得します動作するように次のクエリを取得しようとして低迷してる私はNHibernateのに良い量を使用しましたが、LINQのと流暢NHibernateはを基準APIを使用する必要はほとんどありませんどこのsiteId == 1と CODETYPE ==「sampleUnits」

私はそれが

em.createQuery(Restrictions.and(
    Restrictions.eq("siteId", siteId), 
    Restrictions.eq("codeType", codeType) 
)) 

の線に沿って何かする必要があります。しかし、私は一般的なタイピングが正しく取得することはできません知っています。誰かがこの機能の体を埋めるのを助けることができますか?

public ReferenceCodeMetaData[] getMatching(EntityManager em, Integer siteId, String codeType) { 

    return ... 
} 

答えて

2

あなたは、引数としてCriteriaQueryまたはJPQLクエリを取るのEntityManagerのメソッドを使用しているが、あなたの引数の型の種類は、基準を休止状態を指します。このようなメソッドには、次の3つの実装があります。

public ReferenceCodeMetaData[] getMatchingWithJPQL(EntityManager em, 
                Integer siteId, 
                String codeType) { 
    String jpql = "SELECT r FROM ReferenceCodeMetaData r where siteId = :siteId AND codeType = :codeType"; 
    TypedQuery<ReferenceCodeMetaData> query = em.createQuery(jpql, ReferenceCodeMetaData.class); 

    query.setParameter("siteId", siteId); 
    query.setParameter("codeType", codeType); 
    List<ReferenceCodeMetaData> result = query.getResultList(); 

    return result.toArray(new ReferenceCodeMetaData[result.size()]); 
} 

public ReferenceCodeMetaData[] getMatchingWithCriteriaAPI(EntityManager em, 
                  Integer siteId, 
                  String codeType) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<ReferenceCodeMetaData> cq = cb.createQuery(ReferenceCodeMetaData.class); 
    Root<ReferenceCodeMetaData> root = cq.from(ReferenceCodeMetaData.class); 

    cq.select(root) 
     .where(cb.and(
      cb.equal(root.get("siteId"), cb.parameter(Integer.class, "siteId")), 
      cb.equal(root.get("codeType"), cb.parameter(String.class, "codeType")))); 

    TypedQuery<ReferenceCodeMetaData> query = em.createQuery(cq); 

    query.setParameter("siteId", siteId); 
    query.setParameter("codeType", codeType); 
    List<ReferenceCodeMetaData> result = query.getResultList(); 
    return result.toArray(new ReferenceCodeMetaData[result.size()]); 
} 

public ReferenceCodeMetaData[] getMatchingWithJHibernateCriteria(EntityManager em, 
                   Integer siteId, 
                   String codeType) { 
    HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class); 
    Session session = hem.getSession(); 
    // If you use some older version of Hibernate, then unwrap method is not 
    // available and you can use following instead of two lines above: 
    // Session session = (Session) em.getDelegate(); 


    List<ReferenceCodeMetaData> result = session.createCriteria(ReferenceCodeMetaData.class) 
     .add(Restrictions.eq("siteId", siteId)) 
     .add(Restrictions.eq("codeType", codeType)) 
    .list(); 
    return result.toArray(new ReferenceCodeMetaData[result.size()]); 
} 

最初の2つは標準のJPAであり、最後の2つはHibernate固有のものです。それらのすべてが同等のSQLクエリを生成し、同じ結果を生成します。私はこの場合最初のものに行きます。

+0

ああ、本当にこの事を知っている神+100、ありがとう。しばらくあなたの脳を借りることはできますか? –

関連する問題