使用Spring Data JpaRepository获取不同的列值

时间:2019-01-14 18:39:01

标签: spring spring-data-jpa spring-data

我有这个实体(为简便起见,省略了注释):

@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批注,将返回ID,而不是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 :(得分:1)

由于您要请求分页结果,因此创建了不需要的order by。第n页的概念仅在对结果进行排序并且排序来自Pageable方法参数时才有意义。

从查询中删除order by,然后将sort的{​​{1}}属性设置为按类别排序。