在JpaRepository排序方法中按自定义SQL排序

时间:2019-01-08 12:17:14

标签: java hibernate spring-boot spring-data-jpa

是否可以使用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的东西,所以想知道我想做的事在我掉进兔子洞之前是否有可能。

1 个答案:

答案 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"));