You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blaze Persistence调用数据库原生函数表达式不被接受,如何解决?

Blaze Persistence查询报错的问题解决

你的Blaze Persistence代码无法运行,核心问题是直接在inExpression中传入原生SQL字符串的用法不符合Blaze的API规范。

问题根源

Blaze Persistence的inExpression方法不接受原生SQL片段作为参数,它要求通过自身API构造子查询或表达式,而不是直接嵌入原生SQL语句。对比你的JPA Criteria代码,后者是通过criteriaBuilder.function正确封装了原生函数调用,所以能正常工作。

正确实现方式

方式一:用Blaze的函数子查询构造

通过fromFunction调用数据库原生函数,构造合法的子查询:

CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class);
cb.from(Pets.class);
cb.select("petId");
cb.orderByAsc("petId");
// 构造in条件的子查询,调用原生权限校验函数
cb.where("petId").in()
    .fromFunction("get_authorized_pet_id", Long.class)
    .withParameter(5); // 传入账号ID参数
com.blazebit.persistence.PagedList<Tuple> rr = cb.page(1, 10).getResultList();

方式二:用原生子查询语法

如果更倾向于贴近原生SQL的写法,可以使用inNative方法直接传入带参数占位符的原生SQL:

CriteriaBuilder<Tuple> cb = cbf.create(em, Tuple.class);
cb.from(Pets.class);
cb.select("petId");
cb.orderByAsc("petId");
// 用inNative直接传入原生SQL片段,通过占位符传递参数
cb.where("petId").inNative("select pet_id from get_authorized_pet_id(?)", 5);
com.blazebit.persistence.PagedList<Tuple> rr = cb.page(1, 10).getResultList();

内容的提问来源于stack exchange,提问作者Amit Mitra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:15:32