当前位置: 首页 > 面试题库 >

在JPA 2中使用投影

程昕
2023-03-14
问题内容

我需要像下面这样转换一个Hibernate条件查询

curList = session.createCriteria(Islem.class)
                    .createAlias("workingDay", "d")
                    .setProjection(Projections.sum("amount"))
                    .add(Restrictions.eq("currency", CURRENCY))
                    .add(Restrictions.eq("product", product))
                    .add(Restrictions.ne("status", INACTIVE))
                    .add(Restrictions.eq("d.status", ACTIVE))
                    .getResultList();

但是在JPA(2)中,我不知道如何实现投影-在这种情况下-是总和。奇怪的是,Hibernate和JPA(甚至是Hibernate JPA
2)具有如此巨大的差异,尤其是在条件查询中。

我开始

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Islem> cq = cb.createQuery(Islem.class);
Root<Islem> isr = cq.from(Islem.class);
cq.select(isr).where(cb.equal(isr.get("currency"), CURRENCY), 
                     cb.notEqual(isr.get("status"), INACTIVE),
                     cb.equal(isr.get("product"), product));

但是不知道如何在这里实现投影,也没有别名


问题答案:

这是一个老问题,但让我们举个例子:

使用CriteriaBuilderHibernate,与Hibernate不同,您总是从要查询 的结果类型 开始,然后构造投影。

CriteriaBuilder cb = em.getCriteriaBuilder();
//We want Integer result
CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);

//The root does not need to match the type of the result of the query!
Root<Islem> isr = cq.from(Islem.class);

//Create a join to access the variable status of working day
Join<Islem,WorkingDay> join = isr.join("workingDay",JoinType.INNER);

//Create the sum expression
Expression<Integer> sum = cb.sum(isr.get("amount"));

cq.where(
         cb.equal(isr.get("currency"), CURRENCY),
         cb.notEqual(isr.get("status"), INACTIVE),
         cb.equal(isr.get("product"), product),
         cb.equal(join.get("status"), ACTIVE)
).select(sum);

另一方面,如果要查询实际的“金额”值,则可以执行以下操作:

CompoundSelection<Integer> projection = cb.construct(Integer.class, cb.sum(isr.get("amount")));

cq.where(..).select(projection);

List<Integer> amounts = em.createQuery(cq).getResultList();


 类似资料:
  • 我已经验证了@transaction方法是否正确放置,并且在调试堆栈中,我看到事务拦截器和实体管理器是根据对后端的请求创建的(因此没有guice持久性过滤器) 我的感觉表明问题在于会话上下文。我感觉(但我不能真正理解)它在多个请求上重用了我的持久性上下文。 我已经把一些框架放在一起,使这一切都能工作。我使用resteasy作为jax的实现者。guice(4.0beta4)作为cdi实现者,hibe

  • 问题内容: 如何在hibernatePOJO上实现我的唯一约束?假设数据库不包含任何内容。 我在注解中看到了唯一属性,但无法正常工作吗? 如果我想将此约束应用于多个列怎么办? 问题答案: 基本上,没有数据库支持就无法实现唯一约束。 和属性是架构生成工具生成相应约束的指令,它们本身并没有实现约束。 您可以在插入新实体之前进行某种手动检查,但是在这种情况下,您应该意识到并发事务可能存在的问题。 因此,

  • 问题内容: 我目前正在尝试在mongodb内部的文档数组中提取单个对象。这是一个样本数据集: 我可以在mongo中使用以下命令成功查询: 我无法使用mgo进行相同操作,并尝试了以下操作: 使用嵌套(抛出:合成文字中缺少类型,地图文字中缺少键) 我正在使用httprouter,p.ByName(“ …”)调用是传递给处理程序的参数。 提前致谢。 问题答案: 将与该 方法一起使用,因为doc指出,这使

  • 问题内容: JPA和Hibernate当前都不支持JDK8中JSR-310带来的新日期/时间类(JPA 票证,Hibernate 票证)。尽管如此,我还是希望使用JDK8日期/时间类进行编码,因为它们最终经过了精心设计。特别是,我对感兴趣,而不是不完全支持所有类型,因为我的所有实体都将使用此特定类(或者,所以我认为现在至少是:-) 一种选择是编写一个JPA 2.1定义的类型转换器。但是,我们的应用

  • 但我计划为需要多个group BY的报表创建更复杂的查询。我在这里读到了关于多组的正确方法。 如何使用JPA2标准API创建查询?