Сортировка по пользовательскому SQL в методе сортировки JpaRepository - PullRequest
0 голосов
/ 08 января 2019

Можно ли выразить приведенный ниже запрос, используя метод запроса 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 голосов
/ 08 января 2019

Вы можете использовать сортировку, если у вас есть имя свойства, которое сопоставимо. Попробуйте изменить используемый вами запрос выбора, чтобы включить ключ сортировки в другой столбец:

@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 и ключ сортировки. Теперь вы можете использовать «сортировку» в качестве сортировки по свойству, используя:

repo.findAll(new Sort(Sort.Direction.ASC, "sort"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...