Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Hibrate EntityManager的类型化复杂条件查询_Java_Hibernate_Entitymanager - Fatal编程技术网

使用Java Hibrate EntityManager的类型化复杂条件查询

使用Java Hibrate EntityManager的类型化复杂条件查询,java,hibernate,entitymanager,Java,Hibernate,Entitymanager,我通常不熟悉Java、Hibernate或EntityManager。我已经大量使用了NHibernate,但是对于Linq和Fluent NHibernate,几乎不需要使用criteria api,所以我正在努力让下面的查询正常工作 获取siteId==1且 代码类型==“采样单元” 我知道这应该是类似于 em.createQuery(Restrictions.and( Restrictions.eq("siteId", siteId), Restrictions.eq("codeT

我通常不熟悉Java、Hibernate或EntityManager。我已经大量使用了NHibernate,但是对于Linq和Fluent NHibernate,几乎不需要使用criteria api,所以我正在努力让下面的查询正常工作

获取siteId==1且 代码类型==“采样单元”

我知道这应该是类似于

em.createQuery(Restrictions.and(
  Restrictions.eq("siteId", siteId),
  Restrictions.eq("codeType", codeType)
))
但是我不能正确地输入通用类型。有人能帮我填写这个函数的正文吗

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

  return ...
} 

您在EntityManager中使用的方法将CriteriaQuery或JPQL query作为参数,但参数类型的类型引用Hibernate条件。以下是此类方法的三种可能实现:

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()]);
}
public ReferenceCodeMetaData[]GetMatching with JPQL(EntityManager em,
整数siteId,
字符串代码类型){
String jpql=“从引用中选择r,其中siteId=:siteId和codeType=:codeType”;
TypedQuery=em.createQuery(jpql,ReferenceCodeMetaData.class);
query.setParameter(“siteId”,siteId);
setParameter(“codeType”,codeType);
List result=query.getResultList();
返回result.toArray(新的ReferenceCodeMetaData[result.size()]);
}
公共引用代码元数据[]getMatchingWithCriteriaAPI(EntityManager em,
整数siteId,
字符串代码类型){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(ReferenceCodeMetaData.class);
Root=cq.from(referencecodematadata.class);
选择(根)
.在哪里(cb和(
cb.equal(root.get(“siteId”),cb.parameter(Integer.class,“siteId”),
相等(root.get(“codeType”)、cb.parameter(String.class,“codeType”));
TypedQuery=em.createQuery(cq);
query.setParameter(“siteId”,siteId);
setParameter(“codeType”,codeType);
List result=query.getResultList();
返回result.toArray(新的ReferenceCodeMetaData[result.size()]);
}
公共引用代码元数据[]获取与Jhibernatecriteria(EntityManager em,
整数siteId,
字符串代码类型){
HibernateEntityManager hem=em.unwrap(HibernateEntityManager.class);
Session Session=hem.getSession();
//如果您使用一些较旧版本的Hibernate,则不使用“展开”方法
//可用,您可以使用以下内容,而不是上面的两行:
//会话=(会话)em.getDelegate();
列表结果=session.createCriteria(ReferenceCodeMetaData.class)
.add(Restrictions.eq(“siteId”,siteId))
.add(Restrictions.eq(“codeType”,codeType))
.list();
返回result.toArray(新的ReferenceCodeMetaData[result.size()]);
}

前两个是标准JPA,最后一个是特定于Hibernate的。它们都生成等价的SQL查询并生成相同的结果。我会在这个案例中选第一个。

哦,感谢上帝+100,最后是一个真正了解这件事的人。我能借用一下你的大脑吗?