Blaze-Persistence:给 JPA 加一层本该有的查询能力
文章目录Blaze-Persistence给 JPA 加一层本该有的查询能力1、 它要解决的问题2、 核心能力3、 Entity View 模块4、 怎么用5、 兼容性6、 适合哪些人Blaze-Persistence给 JPA 加一层本该有的查询能力Blaze-Persistence 在 GitHub 上拿到了 855 Star。它做的事很专一给 JPA 提供一套更厚的 Criteria API把用 JPA 时碰到的一堆限制补回来。CTE、递归查询、UNION、RETURNING、键集分页这些原生 JPA 不支持的东西它能写。1、 它要解决的问题用 JPA 写过复杂查询的人大概都清楚。NamedQuery 写死了 SQL JPQL 表达能力有限标准 Criteria API 啰嗦还容易写错遇到分页深翻就性能崩盘。多投一投少用一些 SELECT本来数据库一行 SQL 解决的事要么拆成多次查询在内存里拼要么直接绕开 ORM 写原生 SQL。Blaze-Persistence 把这层补上了。它不是替代 JPA 的 ORM是架在 JPA 之上的一套查询构造器底层还是走 Hibernate、EclipseLink、DataNucleus 这些 provider。开发者用它的 fluent API 写查询它翻译成对应 provider 能跑的 SQL。2、 核心能力能做的事大致这么几类:普通 JPA 写不出来的 SQL 特性它给做成了 API。CTE 和递归 CTE 可以定义临时结果集DML CTE 可以在 CTE 里做修改操作。RETURNING 子句让 INSERT/UPDATE/DELETE 后直接拿到改动后的数据省一次回查。UNION、EXCEPT、INTERSECT 这些集合操作能拼出多结果合并的查询以前得绕好几道弯。VALUES 子句可以做报表查询group_concat、日期截取、日期运算这些函数它内置了一堆跨 provider 表现一致。键集分页解决了深翻页的性能问题传统 OFFSET 翻得越深越慢键集用上一页最后一行的键定位翻多深都稳定。3、 Entity View 模块这个模块单独说一句。它的思路类似数据库的视图但作用在 JPA 实体上。实际项目里 DTO 是绕不开的东西。直接查实体出来一堆懒加载和 N1手写 DTO 又要维护投影逻辑。Entity View 让你写一个接口描述要哪些字段框架自动生成 JOIN 和投影 SQL。写法上像这样EntityView(Cat.class)publicinterfaceCatView{IdMappingIntegergetId();Mapping(CONCAT(mother.name, s kitty , name))StringgetCuteName();SimpleCatViewgetFather();}cuteName是计算字段JPQL 表达式直接给。father关联自动 LEFT JOIN 出来。查询时把 view 应用到 CriteriaBuilder 上拿到结果前只取了需要的那几列不发多余的 SQL。4、 怎么用Maven 引入给一个版本属性就够了模块都按这个版本一起发布propertiesblaze-persistence.version1.6.18/blaze-persistence.version/properties入口是CriteriaBuilderFactory和EntityManagerFactory同生命周期CriteriaBuilderConfigurationconfigCriteria.getDefault();CriteriaBuilderFactorycbfconfig.createCriteriaBuilderFactory(entityManagerFactory);写一个查询把关联一起 fetch 进来一行就能完事cbf.create(em,Cat.class).fetch(kittens.father).getResultList();底层生成的 SQL 是带两个 LEFT JOIN FETCH 的语句路径写错了会基于 metamodel 提前报错不用等到运行时。5、 兼容性支持的版本跨度很宽。Hibernate 从 4.2 一路到 7.1EclipseLink 2.6Spring 4.3Spring Data 1.11 到 3.5Quarkus 1.4。最低只要 JPA 2.0能塞进 Java EE 6 或 Spring 4 的老项目。Java 运行时方面能跑在 Java 7 上最新测到 Java 21。Spring Boot、DeltaSpike Data、JAX-RS、GraphQL、Jackson 这些都有现成集成模块要接进去基本不用自己写胶水代码。6、 适合哪些人觉得 JPA Criteria 啰嗦难维护、又不想退回原生 SQL 的团队查询里有 UNION、CTE、深分页原生 JPA 写不出来只能换方案的人DTO 投影逻辑散得到处都是、想统一管理前端返回结构的项目老项目里 Hibernate 4.x 还在跑、想升级查询能力但不能动 ORM 的开发者如果想试水作者提供了 Maven archetypecore、entity-view、spring-data、spring-boot、quarkus 各种集成模板都有一条命令生成完整可跑的工程自己改着试就行。etypecore、entity-view、spring-data、spring-boot、quarkus 各种集成模板都有一条命令生成完整可跑的工程自己改着试就行。