Spring Data JPA QueryDslPredicateExecutor找到不同的结果

时间:2014-11-03 10:30:03

标签: java spring hibernate spring-data-jpa querydsl

我有一个Spring Data&基于JPA QueryDSL的项目,其中我有许多扩展QueryDslPredicateExecutor的存储库接口,如下所示:

public interface ProductRepository extends JpaRepository<Product, Long>,
    QueryDslPredicateExecutor<Product> {
}

我正在我的应用程序中使用findAll()执行BooleanExpression次查询以获取数据。但是,我现在需要根据特定列找到查询的不同结果。

我也在使用Projections&amp;在某些情况下,自定义存储库可根据this post选择特定列。

有没有办法select distinct,以便我只根据上述任何一种方法获取查询的特定列的不同值?

2 个答案:

答案 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);
}

此代码基于QuerydslJpaRepositoryfindAll(Predicate, Pageable)方法。我假设可以很容易地扩展此存储库,以便使用findAllDistinct添加JPQLQuery.distinct()方法。

我已经提交了feature request at spring-data's JIRA

希望这有助于某人。

答案 1 :(得分:0)

如果您直接在存储库中使用Querydsl查询,则可以调用query.distinct()以获得不同的结果。