xiaoq

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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);

 

posted on 2018-01-23 16:29  xiaoqhuang  阅读(1446)  评论(0编辑  收藏  举报