JPA setParameter 传入null参数

本文介绍了解决JPA在处理数字类型null参数时遇到的问题。通过实现自定义参数类并利用setParameter方法的特定重载,可以有效避免因传入null而引发的数据库异常。

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

 

转载于:https://www.cnblogs.com/xiaoq/p/8336466.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值