在我看来,Spring Data JPA的创建主要是为了通过方法名称生成查询来轻松创建查询。但是,我需要创建复杂的查询,而我无法利用查询生成器。因此,我坚持在规范上调用findAll(),后者使用普通的JPA标准来构建我的查询。好像我可能会删除Spring Data,然后呢?
除了自动查询生成之外,Spring Data是否还有其他任何技术优势,如果我使用的话,那是我无法获得的,例如Spring Boot with JPA?
(P.S。 - 我无法直接使用JPQL,因为我的查询是动态创建的,并且必须是类型安全的)
答案 0 :(得分:4)
是的,当然还有其他好处!
所有“基本”查询已经实施,即findById,保存,删除
分页工作开箱即用。您可以将Pageable
对象简单地从Controller传递到Service到您的存储库,它就可以了! (包括排序)
使用Spring的Specification
API比普通的JPA更简单,因为您只需创建谓词而不必使用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));
}
答案 1 :(得分:2)
我身边还有两点
Spring Data JPA提供的抽象允许将持久层从一个关系模型更改为另一个关系模型,而无需任何样板代码和巨大的重构。
查询查找策略,在引导时验证@Query带注释的查询,这样如果存储库基础结构在引导时没有找到方法的声明查询,它就会失败。
如上所述,最大的好处是您可以通过单一访问点内置所有CRUD操作,此外,您还可以使用QueryDSL或规范为复杂查询实现自定义存储库 - 所以如你所说,你有类型安全的查询。同样,在最后,您可以通过单一界面获得所有DAO方法的单一访问点。
P.S。与标准相比,QueryDSL更安全,更紧凑,类似于JPQL语法,更易于使用。