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、 核心能力

README区域截图

能做的事大致这么几类:

普通 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 是绕不开的东西。直接查实体出来一堆懒加载和 N+1,手写 DTO 又要维护投影逻辑。Entity View 让你写一个接口描述要哪些字段,框架自动生成 JOIN 和投影 SQL。

写法上像这样:

@EntityView(Cat.class)
public interface CatView {
    @IdMapping
    Integer getId();

    @Mapping("CONCAT(mother.name, 's kitty ', name)")
    String getCuteName();

    SimpleCatView getFather();
}

cuteName 是计算字段,JPQL 表达式直接给。father 关联自动 LEFT JOIN 出来。查询时把 view 应用到 CriteriaBuilder 上,拿到结果前只取了需要的那几列,不发多余的 SQL。

4、 怎么用

Maven 引入,给一个版本属性就够了,模块都按这个版本一起发布:

<properties>
    <blaze-persistence.version>1.6.18</blaze-persistence.version>
</properties>

入口是 CriteriaBuilderFactory,和 EntityManagerFactory 同生命周期:

CriteriaBuilderConfiguration config = Criteria.getDefault();
CriteriaBuilderFactory cbf = config.createCriteriaBuilderFactory(entityManagerFactory);

写一个查询,把关联一起 fetch 进来一行就能完事:

cbf.create(em, Cat.class).fetch("kittens.father").getResultList();

底层生成的 SQL 是带两个 LEFT JOIN FETCH 的语句,路径写错了会基于 metamodel 提前报错,不用等到运行时。

5、 兼容性

支持的版本跨度很宽。Hibernate 从 4.2 一路到 7.1,EclipseLink 2.6+,Spring 4.3+,Spring Data 1.11 到 3.5,Quarkus 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 archetype,core、entity-view、spring-data、spring-boot、quarkus 各种集成模板都有,一条命令生成完整可跑的工程,自己改着试就行。

etype,core、entity-view、spring-data、spring-boot、quarkus 各种集成模板都有,一条命令生成完整可跑的工程,自己改着试就行。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐