2011-12-19 1 views
0

Я вообще не знаком с Java, Hibernate или EntityManager. Я использовал NHibernate хорошую сумму, но с Linq и Fluent NHibernate вряд ли есть необходимость использовать критерии API, так что я вроде барахтается, пытаясь получить следующий запрос работатьТипичный запрос сложных критериев с Java Hiberate EntityManager

Получить все экземпляры ReferenceCodeMetaData где 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

Вы используете метод в EntityManager, который принимает CriteriaQuery или JPQL запрос в качестве аргумента, но тип ваших типов аргументов относится к Hibernate Criteria. Вот три возможных реализаций такого метода:

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

Первые два стандартных JPA и последняя является Hibernate специфичны. Все они генерируют эквивалентный SQL-запрос и производят тот же результат. В этом случае я бы пошел первым.

+0

О слава богу +100, наконец, кто-то, кто действительно знает этот материал. Могу ли я просто взять мозг на некоторое время? –

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