Hibernate 带in参数的写法

  最近在改项目中未使用绑定变量传参的SQL,遇到了这个坑(其实还是自己经验不足~),特此记下来。先来看一下原dao中的方法:hibernate HQL语句查询时遇到一个问题,用了绑定变量的方式传参,可是就是查不出结果集。

public List<Map<String, Object>> findCargotypecode(String bnos,String filterCargotypecodes) {
        final String sql = "SELECT T.BNO FROM TM_ORIGINAL_DATA T WHERE T.BNO IN ("+bnos+") AND T.CARGOTYPECODE IN ("+filterCargotypecodes+")";
        return (List<Map<String, Object>>) getHibernateTemplate().execute(
                new HibernateCallback() {
                    public Object doInHibernate(Session session)throws HibernateException, SQLException {
                        Query query = session.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
                        return query.list();
                    }
                });
    }

其中参数bnos和filterCargotypecodes都是“ ‘a’, ‘b’, ‘c’”类似这种字符串(先别吐槽为毛查一个字段却用Map泛型接收,这都是历史遗留问题,手动滑稽),起初我也没在意,就按照单个传参来传了,于是代码被改成了这样:

    public List<Map<String, Object>> findCargotypecode(final String bnos,final String filterCargotypecodes){
        final String sql = "SELECT T.BNO FROM TM_ORIGINAL_DATA T WHERE T.BNO IN (:bnos) AND T.CARGOTYPECODE IN (:filterCargotypecodes)";
        return (List<Map<String, Object>>) getHibernateTemplate().execute(
                new HibernateCallback() {
                    public Object doInHibernate(Session session)
                            throws HibernateException, SQLException {
                        return session.createSQLQuery(sql)
                        .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
                                .setString("bnos",bnos)
                                .setString("filterCargotypecodes",filterCargotypecodes)
                                .list();
                    }
                });
    }

本以为这样就完事儿了,殊不知测试的时候就出问题了:倒是没报错,但是查不出数据。数据库有数据,但是hibernate死活查不出数据。
  查了半天,原来猫腻在这:setString方法,hibernate会视这为一整个字符串。效果如:

select * from A where a.bno in (“‘a’, ‘b’, ‘c’”)

  这种SQL显然不是我们要的,我们要的是下面这种:

select * from A where a.bno in (“a”,”b”,”c”)

那么问题来了,怎么改?其实很简单,有个方法叫

setParameterList(String name,Collection vals)

重载方法有

setParameterList(String name,Object[] vals)

(PS:翻了下源码,推荐用第一个传集合的,因为实际上传了数组hibernate依然会转成集合操作)
估计大家看到方法就明白怎么回事了,就不解释了,直接上代码

    public List<Map<String, Object>> findCargotypecode(final String []bnos,final String[] filterCargotypecodes){
        final String sql = "SELECT T.BNO FROM TM_ORIGINAL_DATA T WHERE T.BNO IN (:bnos) AND T.CARGOTYPECODE IN (:filterCargotypecodes)";
        return (List<Map<String, Object>>) getHibernateTemplate().execute(
                new HibernateCallback() {

                    public Object doInHibernate(Session session)
                            throws HibernateException, SQLException {
                        return session.createSQLQuery(sql)
                                .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)
                                .setParameterList("bnos",bnos)
                                .setParameterList("filterCargotypecodes",filterCargotypecodes)
                                .list();
                    }
                });
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值