我需要类似于此 SQL 查询的内容:
SELECT * FROM foo f ORDER BY GREATEST(f.bar_date, f.baz_date)
由于并非所有 RDBMS 系统都支持该GREATEST
功能,理想情况下,我希望 JPA 实现为底层数据库生成正确的 SQL 查询。我的目标数据库是 Oracle、SQL Server 和 PostgreSQL。
JPQL 允许 FUNCTION 运算符调用数据库函数。
Oracle 和 Postgres 支持 GREATEST,我认为 SQL Server 不支持,因此您可以编写自己的函数。
您还可以将 CASE 函数与 > 一起使用。
更具体地说,您可以在 JPQL 中使用该CASE
语句执行此操作,该语句自 JPA 2.0 起受支持。为简洁起见,我省略了_date
后缀。
SELECT * FROM foo f ORDER BY CASE WHEN f.bar > f.baz THEN f.bar ELSE f.baz END
我用过 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