Hibernate 带in参数的写法
来源:互联网 发布:区域经济考研知乎 编辑:程序博客网 时间:2024/05/01 01:02
最近在改项目中未使用绑定变量传参的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 0
- Hibernate 带in参数的写法
- [Hibernate框架]Hql语句in中带参数的写法
- JdbcTemplate带in参数的写法
- Oracle绑定变量带in参数的写法
- Hibernate 3 HQL语句in clause绑定参数的写法- -
- 带参数的OPENQUERY查询的写法
- 带参数 宏的简单写法
- TP5 url链接(带参数)的写法
- Hibernate传入两个参数时的写法
- vb6.0带 参数(索引)的属性的写法
- C# LinkButton 带参数的OnCommand事件的写法
- C#中带参数的select语句写法
- struts2 配置文件 重定向 redirect (带参数) 的写法
- 存储过程带输出参数,建job的what写法
- 获取带 in 的sql参数列表
- 参数化SQL中 Like 和 In 的写法
- 关于Mysql中in参数变量的另外一种写法
- hibernate namequery in 参数的设置
- BNU20409 UVA11991
- jQuery append动态添加的元素添加事件没有效果
- 走出这个迷宫
- C++Primer(第四章课后习题)(程序题源代码)
- CentOS 无密码 ssh 登陆
- Hibernate 带in参数的写法
- 怎样隐藏导航状态栏NavigationBar
- iOS 隐藏导航栏底部线的两种方法
- git pull出错fatal:Please make sure you have the correct access rights.and the repository exists.
- html中<img>标签的路径问题
- poj2632 Crashing Robots
- Unity3d-从Cocos2d-x到Unity3d的一些不同
- 如何把网页上的图片写入到docx文档
- uva 10900 富翁 连续概率