我需要类似于这个SQL查询的东西:
SELECT * FROM foo f ORDER BY GREATEST(f.bar_date, f.baz_date)
由于并非所有RDBMS系统都支持GREATEST
函数,理想情况下我希望JPA实现为底层数据库生成正确的SQL查询。我目标的数据库是Oracle,SQL Server和PostgreSQL。
答案 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