Spring Data JPA的Specification实际工作原理及参数生成疑问
核心原理说明
你写的代码本质是定义Specification接口的实现逻辑,并没有立刻触发执行,三个参数是Spring Data JPA框架在后续执行查询时自动创建传入的,具体逻辑如下:
- 首先
Specification是JDK标准的函数式接口,仅包含一个待实现的抽象方法:
你代码里写的Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder)(root, query, criteriaBuilder) -> { ... }lambda表达式,就是对这个toPredicate方法的逻辑实现,此时你只是定义了查询条件的生成规则,没有调用这个方法,自然不需要你自己创建参数传入。 - 当你把构造好的
Specification实例传入JpaRepository的查询方法(比如常用的findAll(Specification<Player> spec))时,Spring Data JPA框架内部会自动完成三个参数的构造:Root<Player>:框架根据你指定的查询实体Player生成,代表查询的根对象,专门用来获取实体的字段属性,你代码里的root.get("name")就是通过这个对象取到Player实体的name字段CriteriaQuery<?>:框架生成的查询结构对象,用来定义整个查询的select、where、分组、排序等顶层规则CriteriaBuilder:框架生成的条件构造工具类,提供了like、equal、between等大量方法用来生成具体的查询谓词
- 最后框架会自动调用你实现的
toPredicate方法,把上面三个构造完成的对象作为参数传入,拿到你返回的查询条件Predicate后,组装成完整的SQL语句执行数据库查询。
内容的提问来源于stack exchange,提问作者Jeff_Mer
相关产品推荐
相关产品推荐

