【问题标题】:Benefits of Spring Data if not using query generation by method name?如果不使用方法名称的查询生成,Spring Data 的好处?
【发布时间】:2015-04-14 20:31:48
【问题描述】:
在我看来,Spring Data JPA 的创建主要是为了通过方法名称生成查询来轻松创建查询。但是,我需要创建复杂的查询,并且无法利用查询生成器。因此,我坚持在规范上调用 findAll(),该规范在幕后使用纯 JPA 标准来构建我的查询。看来我还不如放弃 Spring Data 呢?
除了自动查询生成之外,Spring Data 是否还有其他技术优势,如果我使用了 Spring Boot with JPA,我无法获得这些优势?
(附注 - 我不能直接使用 JPQL,因为我的查询是动态创建的并且必须是类型安全的)
【问题讨论】:
标签:
java
spring
hibernate
spring-boot
spring-data
【解决方案1】:
是的,当然还有其他好处!
所有“基本”查询都已实现,即 findById、save、delete
分页开箱即用。您可以将Pageable 对象简单地从控制器传递到服务到您的存储库,它就可以工作! (包括排序)
-
使用 Spring 的 Specification API 比普通的 JPA 东西简单一点,因为您只需创建 Predicates 而不必搞乱EntityManager 和PersistenceContext。
当使用 Java8 时,它变得非常好!
public class MySpecification {
public static Specification<MyEntity> isDeleted() {
return (root, query, cb) -> {
return cb.isTrue(root.get(MyEntity_.deleted));
};
}
}
然后使用它:
@Autowired
private MyEntityRepo repo;
public void test() {
repo.findAll(Specifications.where(MySpecification.isDeleted()));
}
另一种选择可能是使用 QueryDSL。使用 Spring Data Repositories 时它不如 JPA Criteria 灵活,但这些查询看起来超级性感!
public void test() {
QMyEntity myEntity = QMyEntity.myEntity;
repo.findAll(myEntity.deleted.eq(true));
}
【解决方案2】:
我这边还有两点
如上所述,最大的好处是您可以通过单个访问点内置所有 CRUD 操作,此外,您还可以使用 QueryDSL 或规范为您的复杂查询实现自定义存储库 - 所以您有如您所说,键入安全查询。再一次,最后,您可以通过单一接口获得所有 DAO 方法的单一访问点。
附:与标准相比,QueryDSL 类型更安全,更紧凑,与 JPQL 语法相似且更易于使用。