我有一个Spring Data&基于JPA QueryDSL的项目,其中我有许多扩展QueryDslPredicateExecutor的存储库接口,如下所示:
public interface ProductRepository extends JpaRepository<Product, Long>,
QueryDslPredicateExecutor<Product> {
}
我正在我的应用程序中使用findAll()
执行BooleanExpression
次查询以获取数据。但是,我现在需要根据特定列找到查询的不同结果。
我也在使用Projections&amp;在某些情况下,自定义存储库可根据this post选择特定列。
有没有办法select distinct
,以便我只根据上述任何一种方法获取查询的特定列的不同值?
答案 0 :(得分:1)
今天我遇到了同样的问题,似乎没有直接的存储库方法来解决它。
我最终使用Querydsl来完成我想要的工作:能够使用不同的Page<T> findAll(Predicate var1, Pageable var2);
。
一个简单的片段:
public Page<LocalizedMessage> findAll(Predicate predicate, Pageable pageable) {
QMessage qMessage = QMessage.message;
Querydsl querydsl = new Querydsl(entityManager, new PathBuilder<>(Message.class, qMessage.getMetadata()));
JPAQuery countQuery = querydsl.createQuery(qMessage).distinct().where(predicate);
JPAQuery query = querydsl.createQuery(qMessage).distinct().where(predicate);
querydsl.applyPagination(pageable, query);
return PageableExecutionUtils.getPage(query.fetch(), pageable, countQuery::fetchCount);
}
此代码基于QuerydslJpaRepository的findAll(Predicate, Pageable)
方法。我假设可以很容易地扩展此存储库,以便使用findAllDistinct
添加JPQLQuery.distinct()
方法。
我已经提交了feature request at spring-data's JIRA。
希望这有助于某人。
答案 1 :(得分:0)
如果您直接在存储库中使用Querydsl查询,则可以调用query.distinct()
以获得不同的结果。