【问题标题】:Spring Data JPA QueryDslPredicateExecutor find distinct resultsSpring Data JPA QueryDslPredicateExecutor 找到不同的结果
【发布时间】:2014-12-29 23:50:10
【问题描述】:

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

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

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

在某些情况下,我还使用 Projections & Custom 存储库来选择基于 this post 的特定列。

有没有办法select distinct,这样我就只能根据上述任何方法获得查询的特定列的不同值?

【问题讨论】:

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


    【解决方案1】:

    今天我遇到了同样的问题,似乎没有直接的存储库方法来解决它。

    我结束了使用Querydsl 以完成我想要的:能够使用Page&lt;T&gt; findAll(Predicate var1, Pageable var2); 使用 distinct。

    一个简单的sn-p:

    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) 方法。我认为扩展这个存储库很容易,以便使用JPQLQuery.distinct() 添加findAllDistinct 方法。

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

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-05
        • 2016-01-06
        • 2017-08-29
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多