Как создать Pageable для сортировки по вложенному свойству?
Имеется две сущности: Cat и Kitty (не обращайте внимание на отсутствие некоторых аннотаций, это всего лишь пример):
public class Cat {
int id;
String name;
int age;
@OneToOne
Kitty kitty;
}
public class Kitty {
int id;
String name;
@OneToOne
Cat cat;
}
Я реализовал JpaRepository для сущности Cat и теперь хочу получать списки котов, используя при этом сортировку:
public interface CatRepository extends JpaRepository<Cat, Integer> {
@Query("SELECT c FROM Cat c WHERE c.age=:age")
List<Cat> getAllByAge(int age, Pageable pageable);
}
Насколько видно, я передаю в метод объект Pageable, который используется для сортировки. Собственно, вот возник вопрос. Например, если я хочу сделать сортировку по имени кота, я создаю Pageable таким образом:
PageRequest.of(pageNum, pageSize, direction, "name");
А что, если я хочу сделать сортировку, допустим, по имени котёнка? Я бы сделал вот такой запрос:
SELECT c FROM Cat c WHERE c.age=:age ORDER BY c.kitty.name
Вот только запрос - штука неповоротливая. Именно поэтому я и использую Pageable, и как мне его в таком случае создать? Будет ли работать такой вариант:
PageRequest.of(pageNum, pageSize, direction, "kitty.name");
И если это не будет работать, то как мне тогда можно сортировку по вложенному свойству?
Ответы (1 шт):
Да, для создания Pageable можно использовать вложенные свойства. К сожалению я не знаю тонкостей и не знаю, как именно интерпретируется Pageable, но вот здесь на Baeldung приводится пример правильного составления запроса с countQuery для версии Spring Data JPA до 2.0.4:
@Query(
value = "SELECT * FROM Users ORDER BY id \n-- #pageable\n",
countQuery = "SELECT count(*) FROM Users",
nativeQuery = true)
Page<User> findAllUsersWithPagination(Pageable pageable);
Исходя из этого могу предположить, что сначала JPQL запрос дополняется данными из Pageable, а только потом конвертируется в SQL запрос. Скорее всего поэтому вложенные свойства в Pageable и работают. Но на самом деле это только моё предположения и я был бы признателен, если бы кто-нибудь пояснил, как это работает на самом деле.