是否可以使用JPA查询方法来表达以下查询?
@Query(
value =
"SELECT a FROM #{#entityName} a"
+ "LEFT JOIN Other o ON a.otherId = o.id"
+ "ORDER BY CASE WHEN o.foo = 'A' then 1"
+ " WHEN o.foo = 'S' then 2"
+ " WHEN o.foo = 'D' then 3"
+ " ELSE 4"
+ " END, a.createdDate DESC NULLS LAST")
List<T> findAllCustomSorted();
类似这种查询方法
List<T> findAll(Sort sort);
这样称呼
String fooProperty = "CASE WHEN o.foo = 'A' then 1"
+ "WHEN o.foo = 'S' then 2"
+ "WHEN o.foo = 'D' then 3"
+ "ELSE 4"
+ END;
String dateProperty = "createdDate";
repo.findAll(
new Sort(
new Order(Direction.ASC, fooProperty, NullHandling.NULLS_LAST),
new Order(Direction.DESC, dateProperty, NullHandling.NULLS_LAST)));
现在这不起作用。
但是我发现了一种叫做JpaSort.unsafe()
和JpaPath
的东西,所以想知道我想做的事在我掉进兔子洞之前是否有可能。
答案 0 :(得分:0)
如果具有可比较的属性名称,则可以使用“排序”。尝试更改用于将排序键包括在另一列中的选择查询:
@Query(
value =
"SELECT a, CASE WHEN o.foo = 'A' then 1"
+ " WHEN o.foo = 'S' then 2"
+ " WHEN o.foo = 'D' then 3"
+ " ELSE 4"
+ " END sort FROM #{#entityName} a"
+ "LEFT JOIN Other o ON a.otherId = o.id"
+ "ORDER BY a.createdDate DESC NULLS LAST")
List<T> findAllCustomSorted();
这意味着您的结果将具有两列-a及其排序键。现在,您可以使用
将“ sort”用作按属性排序repo.findAll(new Sort(Sort.Direction.ASC, "sort"));