Получить различные значения столбца с помощью Spring Data JpaRepository - PullRequest
0 голосов
/ 14 января 2019

У меня есть этот объект (для краткости аннотации опущены):

@Entity
class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Lob
    private String category;

    @Lob
    private String name;

    @Lob
    private String customer_number;

    // more attributes omitted
}

Я должен получить список различных значений category для определенного uid

По моему JpaRepository У меня есть это:

@Query("SELECT DISTINCT product.category FROM Product as product WHERE product.customerNumber = :cn ORDER BY product.category")
Page<String> findDistinctCategoryByCustomerNumber(String cn,
                                                  Pageable pageable);

Без аннотации @Query вместо значений category возвращаются идентификаторы. Сгенерированный SQL выглядит так:

select distinct product0_.id as id1_0_, product0_.customer_number as customer2_0_, product0_.category as directory3_0_, product0_.name as name4_0_ from product product0_ 
where product0_.customer_number=? 
order by product0_.id desc limit ?

Но мне нужны отдельные категории, а не объекты продукта. Если не считать другой идеи, я добавил аннотацию @Query выше. Но теперь я получаю эту ошибку:

Order by expression "PRODUCT0_.ID" must be in the result list in this case; SQL statement:
select distinct product0_.directory as col_0_0_ from product product0_ where product0_.customer_number=? order by product0_.directory, product0_.id desc limit ? [90068-197]

Но я не могу добавить id в список результатов, потому что это сделает DISTINCT бесполезным, так как id является первичным ключом.

Так что мне нужно либо подходящее имя метода для автоматической генерации запроса, либо способ остановить JpaRepository от добавления его предложения order by в конец моего @Query.

1 Ответ

0 голосов
/ 15 января 2019

Нежелательный order by создается, так как вы запрашиваете постраничный результат. Понятие n-й страницы имеет смысл только тогда, когда ваши результаты упорядочены, и порядок исходит из аргумента Pageable метода.

Удалите order by из вашего запроса и установите атрибут sort вашего Pageable для сортировки по категории.

...