JPQL / JPA查询基于最大/最大两列的订单实体?

时间:2013-09-17 07:48:00

标签: jpa jpql

我需要类似于这个SQL查询的东西:

SELECT * FROM foo f ORDER BY GREATEST(f.bar_date, f.baz_date)

由于并非所有RDBMS系统都支持GREATEST函数,理想情况下我希望JPA实现为底层数据库生成正确的SQL查询。我目标的数据库是Oracle,SQL Server和PostgreSQL。

3 个答案:

答案 0 :(得分:2)

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

Oracle和Postgres支持GREATEST,我不认为SQL Server会这样做,所以你可以编写自己的函数。

您还可以使用带有>。

的CASE函数

答案 1 :(得分:0)

更具体一点 - 您可以使用CASE语句在JPQL中执行此操作,该语句自JPA 2.0起支持。为简洁起见,我省略了_date后缀。

SELECT * FROM foo f ORDER BY CASE WHEN f.bar > f.baz THEN f.bar ELSE f.baz END

答案 2 :(得分: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