关于PreparedStatement以及Jpa中in参数的设置

关于PreparedStatement以及Jpa中in参数的设置

在实际开发的过程中,都会遇到sql语句需要传in的参数的问题,小白我在开发的过程中也踩了好多坑,今天这里结合一些大大给的答案,简单的总结一下使用PreparedStatement以及在JPA中使用Query时, in后面的参数设置的方法。

PreparedStatement in参数设置

PreparedStatement中本身提供的方法setArray()方法并不适用于mysql,当你在使用的过程中会报SQLFeatureNotSupportedException异常。这里如果需要设置in的参数,需要对参数进行拼接。下面提供案例:

public void function(String [] list)
{
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < list.length; i++) {
            buffer.append("?, ");
        }
        buffer.deleteCharAt(buffer.length() - 1);
        buffer.deleteCharAt(buffer.length() - 1);
        String sql = "select * from Student a where a.id in ("+buffer+")";
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            con = DbConnectionManager.getConnection();
            pstmt = con.prepareStatement(sql);
            for (int i = 0; i < list.length; i++) {
                pstmt.setString(i + 1, list[i]);
            }
            rs = pstmt.executeQuery();
            if (rs.next()) {
            ........
            }
        } catch (Exception e) {
            ........
        } finally {
            DbConnectionManager.closeConnection(rs, pstmt, con);
        }
    }

这里采用字符串拼接的方法,拼接出类似(?, ?, ?)的参数方式来实现in的参数设置

JPA query查询语句中实现in的参数设置

在使用JPA query时我们会发现并没有hibernate提供setParameterList方法,这个时候,如果要对in的参数进行设置,我们可以采用query原生的setParameter方法,不过在使用setParameter方法时,需要将数组进行转换,转换为对应的list对象,传入参数中,下面案例提供参考。

public void function(String [] list) {
        String sql = "select * from Student a where a.id in (?1)";
        Query query = entityManager.createNativeQuery(sql);
        List<String> res = new ArrayList<String>(list.length);
        for (String s:list){
            res.add(s);
        }
        query.setParameter(1, res);
    }

这样我们就可以实现in参数的设置。

以上是小白我在实际开发过程中踩过的坑,希望可以为你们解决一些小难题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值