gpt4 book ai didi

java - 使用 Java Hibernate EntityManager 键入复杂条件查询

转载 作者:行者123 更新时间:2023-12-02 08:03:20 25 4
gpt4 key购买 nike

我通常不熟悉 Java、Hibernate 或 EntityManager。我已经大量使用 NHibernate,但是使用 Linq 和 Fluent NHibernate 几乎不需要使用标准 api,所以我在尝试让以下查询工作时陷入困境

Get all instances of ReferenceCodeMetaData where siteId == 1 and codeType == 'sampleUnits'

我知道它应该类似于

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 查询作为参数的方法,但参数类型的类型是指 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 查询并产生相同的结果。在这种情况下我会选择第一个。

关于java - 使用 Java Hibernate EntityManager 键入复杂条件查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com