【问题标题】:Spring Data: Query DTOs with QueryDSL predicatesSpring Data:使用 QueryDSL 谓词查询 DTO
【发布时间】:2017-11-29 08:48:02
【问题描述】:

我正在使用 QueryDSL 来查询/过滤实体(文档):

   public interface DocumentRepository extends PagingAndSortingRepository<Document, Long>, QueryDslPredicateExecutor<Document>

然后我构建 QueryDSL Predicates 并使用方法 findAll 过滤结果:

   Predicate predicate = myBuilder.buildPredicate(myUserFilterObject)
   Page<Document> page = documentRepository.findAll(predicate, pageable)

除了我需要避免 N+1 选择 (JPA) 之外,它运行良好。有什么方法可以查询 DTO 而不是实体(但仍使用 QueryDSL 谓词)或者是否可以在此处应用 EntityGraphs(对我不起作用)?

【问题讨论】:

    标签: java spring-data-jpa querydsl dto entitygraph


    【解决方案1】:

    从 Spring Data JPA 2.1 开始,您可以使用 @EntityGraph 注释。

    public interface DocumentRepository extends PagingAndSortingRepository<Document, Long>, QueryDslPredicateExecutor<Document> {
        @EntityGraph(attributePaths = { "name_of_collection_to_load" })
        Page<Document> findAll(com.querydsl.core.types.Predicate predicate, Pageable pageable)
    }
    

    【讨论】:

    • 好的,它以某种方式工作,但它不能解决 OneToOne 关系(在多层中) - 它仍然添加额外的选择 - 如果我使用 EntityGraph 强制加载 OneToOne主查询中的对象(我们称之为directOneToOneChild),它可以工作,但是如果这个onedirectOneToOneChild有另一个OneToOne关系,那么还有额外的N个选择。
    • 好的,我错过了 NamedAttributeNode/subgraphs,它可以工作。
    猜你喜欢
    • 2016-01-08
    • 2015-01-21
    • 2020-09-18
    • 2017-10-31
    • 2014-08-10
    • 2018-04-06
    • 2014-03-29
    • 2014-08-04
    • 2017-03-15
    相关资源
    最近更新 更多