使用Java Hibrate EntityManager的类型化复杂条件查询
我通常不熟悉Java、Hibernate或EntityManager。我已经大量使用了NHibernate,但是对于Linq和Fluent NHibernate,几乎不需要使用criteria api,所以我正在努力让下面的查询正常工作 获取siteId==1且 代码类型==“采样单元” 我知道这应该是类似于使用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
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,最后是一个真正了解这件事的人。我能借用一下你的大脑吗?