Spring Data JPA和QueryDSL

5

我刚接触Spring Data JPA,并试图了解如何最好地将其与QueryDSL一起使用。在没有QueryDSL的情况下,我可以使用@Query注释在SpringData接口中创建任何查询。

从我所看到的情况来看,为了使用QueryDSL获得相同的体验,我需要创建自己的自定义存储库实现,并使我的repo接口扩展我的自定义实现接口,或者将我所有的QueryDSL查询放置在服务层中,该服务层包装我的repo。

在第一种情况下,我失去了使用任何SD自动生成方法(例如:findAll(QueryDSL predicate))的能力,因为我无法访问实际的repo对象,在第二种情况下,我将查询逻辑放在了服务层而不是repo层。

对我来说,两种解决方案都不是特别吸引人。是否有第三种更合适的方式?或者我误解了如何正确使用QueryDSL和Spring Data?

谢谢!

Eric

1个回答

10
可能最方便的方法是让你的存储库接口简单地扩展QueryDslPredicateExecutor,它添加了将Querydsl Predicate对象直接传递到存储库并独立执行或与PageableSort等一起执行的功能。
如果你真的想将谓词的组合隐藏在存储库层中(这完全可以,但实际上有不同的目的),你可以创建一个单独的存储库实现类,如here所述,并使用QueryDslRepositorySupport作为基类。在你实现的查找器方法中,你可以使用基类的from(…)update(…)delete(…)方法来轻松构建和执行使用Querydsl元模型的查询。

问题不在于“将谓词组合隐藏到存储库中”,对我来说,关键是要向我的查询添加“分组”和...并执行它们,而仅有的谓词似乎无法接近那个目标。 - azerafati
不幸的是,QueryDslPredicateExecutor 不允许使用 groupBy 等操作,只能使用查询的 where 部分。这通常是不够的。但是,使用 QueryDslRepositorySupport 作为基类的自定义存储库实现非常好! - Ruslan Stelmachenko
@azerafati,请查看 https://github.com/infobip/infobip-spring-data-jpa-querydsl,这可能是你正在寻找的。 - Lovro Pandžić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接