【问题标题】: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】:

    是的,当然还有其他好处!

    1. 所有“基本”查询都已实现,即 findById、save、delete

    2. 分页开箱即用。您可以将Pageable 对象简单地从控制器传递到服务到您的存储库,它就可以工作! (包括排序)

    3. 使用 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】:

      我这边还有两点

      • Spring Data JPA 提供的抽象允许持久层从一种关系模型更改为另一种关系模型,无需任何样板代码和大量重构。

      • 查询查找策略,在引导时验证 @Query 带注释的查询,因此如果存储库基础架构在引导时找不到该方法的声明查询,则会失败。

      如上所述,最大的好处是您可以通过单个访问点内置所有 CRUD 操作,此外,您还可以使用 QueryDSL 或规范为您的复杂查询实现自定义存储库 - 所以您有如您所说,键入安全查询。再一次,最后,您可以通过单一接口获得所有 DAO 方法的单一访问点。

      附:与标准相比,QueryDSL 类型更安全,更紧凑,与 JPQL 语法相似且更易于使用。

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 2018-06-24
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多