JPQL / JPA查询如何根据两列中的最大值对实体进行排序?

4
我需要一些类似于这个SQL查询的东西:
SELECT * FROM foo f ORDER BY GREATEST(f.bar_date, f.baz_date)

由于并非所有的关系型数据库管理系统都支持GREATEST函数,因此我希望JPA实现能够为底层数据库生成正确的SQL查询语句。我所针对的数据库是Oracle、SQL Server和PostgreSQL。

3个回答

3

JPQL允许使用FUNCTION运算符调用数据库函数。

Oracle和Postgres支持GREATEST函数,但我不认为SQL Server支持,所以你可能需要编写自己的函数。

你也可以使用CASE函数与>一起使用。


0
更具体地说,您可以使用JPQL中支持自JPA 2.0以来的CASE语句来实现此操作。为了简洁起见,我省略了_date后缀。
SELECT * FROM foo f ORDER BY CASE WHEN f.bar > f.baz THEN f.bar ELSE f.baz END

0

我已经使用了CASE函数。

通过条件构建器,它看起来像:

CriteriaQuery<?> query = ...
CriteriaBuilder builder = entityManager.getCriteriaBuilder();

query.orderBy(builder.selectCase().when(builder.greaterThan(pathToBarDate, pathToBazDate),pathToBarDate).otherwise(pathToBazDate));

在JPQL中应该是这样的

ORDER BY
     CASE WHEN (f.bar_date>f.baz_date) THEN f.bar_date
          ELSE f.baz_date

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接