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
相关产品推荐
相关产品推荐

