JDK1.8环境下JPA原生查询能否选择性设置查询参数?
JDK1.8下JPA原生查询按条件设置参数实现方案
完全可以实现,不需要找QueryOption相关方案,也不需要引入第三方依赖,利用JPA Query API本身的特性就能搞定。
推荐写法(无冗余、可读性高)
JPA原生查询的setParameter、setFirstResult、setMaxResults这些方法,返回值都是当前Query实例本身,你不需要把所有调用硬凑成一整条链式结构,完全可以拆分步骤,持有中间的Query对象做条件判断:
// 初始化查询,先绑定固定参数 Query query = em.createNativeQuery(executionQuery) .setParameter("param1", val1) .setParameter("param2", val2); // 按布尔值判断是否绑定第三个参数 if (addEmail) { query.setParameter("param3", val3); } // 设置分页、执行查询拿到结果 results = query.setFirstResult(offset) .setMaxResults(max) .getResultList();
这种写法和全链式执行效果完全一致:JPA的命名参数绑定只要求参数名和SQL里的:param占位符对应,和setParameter的调用顺序没有关系,JDK1.8全版本兼容,没有隐藏问题。
不推荐的纯链式写法
如果非要保持全链式的代码风格,可以用三目运算符做分支,但会出现重复的初始化代码,可读性很差,实际开发不建议用:
results = (addEmail ? em.createNativeQuery(executionQuery) .setParameter("param1", val1) .setParameter("param2", val2) .setParameter("param3", val3) : em.createNativeQuery(executionQuery) .setParameter("param1", val1) .setParameter("param2", val2)) .setFirstResult(offset) .setMaxResults(max) .getResultList();
注意点
- 不要为了凑链式重复创建Query实例,会产生不必要的对象开销
- 这种分步设参的写法是JPA规范明确支持的用法,不存在版本兼容问题
- 如果你的原生查询配置了返回类型映射,把
Query换成对应的TypedQuery或者映射的实体类型即可,逻辑完全一致
内容的提问来源于stack exchange,提问作者VictorGram
相关产品推荐
相关产品推荐

