JPA setParameter 传入null参数
JPA调用HQL或native SQL、namedQuery语句时
字符串类型的字段传入null没问题,但是数字类型的传入null时会报错,如
java.sql.SQLException: ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 BINARY
奇怪的是网上找了一圈,居然没找到简单的解决方法,作为c# coder很怀念DbNull.value啊。自己研究了一下,发现可以简单解决掉,
解决问题是通过Query的该重载方法:
<T> Query setParameter(Parameter<T> param, T value);
如:
query.setParameter(new Parameter<Integer>() { @Override public String getName() { return "xxId"; } @Override public Integer getPosition() { return null; } @Override public Class<Integer> getParameterType() { return Integer.class; } }, xxId);
为方便使用,封装一个泛型的参数类,提供静态方法用来实例化:
public class JpaParameter<T> implements Parameter<T> { private String parameterName; private Integer position; private Class<T> type; private JpaParameter(Class<T> type, String parameterName) { this.type = type; this.parameterName = parameterName; } private JpaParameter(Class<T> type, Integer position) { this.type = type; this.position = position; } public static Parameter of(Class<?> type, String name) { return new JpaParameter(type, name); } public static Parameter of(Class<?> type, Integer position) { return new JpaParameter(type, position); } @Override public String getName() { return parameterName; } @Override public Integer getPosition() { return position; } @Override public Class<T> getParameterType() { return type; } }
传入参数:
query.setParameter(JpaParameter.of(Integer.class, "xxId"), xxId);