java - 具有 LEAST 和 GREATEST 函数的 JPA CriteriaQuery

标签 java hibernate jpa

我遇到一个问题,我需要使用 LEAST 和 GREATEST 函数连接两个表,但使用 JPA CriteriaQuery。这是我要复制的 SQL...

select * from TABLE_A a
inner join TABLE_X x on
(
  a.COL_1 = least(x.COL_Y, x.COL_Z)
  and
  a.COL_2 = greatest(x.COL_Y, x.COL_Z)
);

我看过CriteriaBuilder.least(..)greatest(..) , 但我很难理解如何创建 Expression<T>传递给任一函数。

最佳答案

比较两列并获得最小值/最大值的最简单方法是使用 CASE 语句。

在 JPQL 中,查询看起来像

select a from EntityA a join a.entityXList x
  where a.numValueA=CASE WHEN x.numValueY <= x.numValueZ THEN x.numValueY ELSE x.numValueZ END
  and   a.numValueB=CASE WHEN x.numValueY >= x.numValueZ THEN x.numValueY ELSE x.numValueZ END 

您可以使用 CriteriaBuilder.selectCase() 编写等效代码但我从来都不是 CriteriaBuilder 的忠实粉丝。如果要求强制您使用 CriteriaBuilder,请告诉我,我可以尝试编写等效代码。

CriteriaBuilder least/greatest 用于获取一列中所有条目的最小/最大值。假设您想要获得具有按字母顺序排列的最大字符串名称的实体。代码看起来像

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(EntityX.class);
Root<EntityX> root = query.from(EntityX.class);

Subquery<String> maxSubQuery = query.subquery(String.class);
Root<EntityX> fromEntityX = maxSubQuery.from(EntityX.class);
maxSubQuery.select(cb.greatest(fromEntityX.get(EntityX_.nameX)));
query.where(cb.equal(root.get(EntityX_.nameX), maxSubQuery));

我在以下位置创建了一个示例 Spring Data JPA 应用程序来演示这些 JPA 示例

https://github.com/juttayaya/stackoverflow/tree/master/JpaQueryTest

关于java - 具有 LEAST 和 GREATEST 函数的 JPA CriteriaQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35759093/

相关文章:

java - 如何在 hql 或 jpql 查询中查询两个不同的数据库(在不同的服务器上)?

java - Hibernate @Filter 枚举列类型

java - 设置为 ReadDirectoryChangesW 打开的目录的最后修改时间

java - 将敏感信息加载到 Protocol Buffer 的最安全方法

hibernate - 通过持久属性的反射访问字段 xxx 时出错

hibernate - 映射异常 : Could not interpret id generator strategy with custom id generator

java - 如何使用 JPA 将 Java 日期存储到 Mysql 日期时间

java - 使用 Tomcat 7 访问上下文特定领域

java - JLabel 中的 HTML 未显示

java - Spring Boot 项目 "org.springframework.beans.factory.BeanCreationException:Error creating bean with name ' entityManagerFactory'"错误