|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-04-29
项目中遇到一个比较有趣的问题:数据库中有两个字段,均为varchar类型,但是其中存放的是数字类型内容。
如:start_no、end_no分别存放100和200,代表起始和终止号码,现在需要在语句中查找起始号码位于一个区间的所有记录,用BETWEEN条件: 在数据库CONSOLE中用: select * from user where LPAD(trim(start_no),8,"0") between 100 and 200 是可以正确查找到所有记录的,但是在HQL中使用该语句则不能正确查找出所有记录: Strin hql = "from User where LPAD(trim(start_no),8,'0') between ? and ?"; ,但是不报错。很是奇怪,不知哪位遇到相似情况?如何解决的?(数据库字段类型不能更改),望不吝赐教。 谢谢! 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-04-29
不使用HQL,试试用session.createSQLQuery方法创建Query对象来查询
|
|
| 返回顶楼 | |
|
时间:2008-04-29
试过,不行。
code: public List getVouDetails(final Integer vou_type, final String start_seq_no, final String end_seq_no) { List vouDetails = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { StringBuffer sb = new StringBuffer(); sb.append("select vou_serial_no"); sb.append(" from vou_details"); sb.append(" where"); sb.append(" vou_type = ? and"); sb.append(" LPAD(trim(start_seq_no),15,'0') between ? and ? and"); sb.append(" status = 0"); log.debug(sb.toString()); SQLQuery s = session.createSQLQuery(sb.toString()); s.addScalar("vou_type", Hibernate.INTEGER); s.addScalar("start_seq_no", Hibernate.STRING); s.addScalar("end_seq_no", Hibernate.STRING); s.setInteger(0, vou_type); s.setString(1, start_seq_no); s.setString(2, end_seq_no); return s.list(); } 查不到任何记录。但是纯SQL语句是可以查到的。 why? |
|
| 返回顶楼 | |
|
时间:2008-04-29
用p6spy查看一下程序向数据库发送的真实SQL语句是什么。
|
|
| 返回顶楼 | |
|
时间:2008-04-29
发现将between条件的两个参数(即数据库中为字符型字段)在设置参数时转化为数字型可以得出正确记录。
还有什么好的办法吗? code: /** 直接取得所需的字段值 **/ public List getVouDetails(final Integer vou_type, final String start_seq_no, final String end_seq_no) { List vouDetails = (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { StringBuffer sb = new StringBuffer(); sb.append("select vou_serial_no"); sb.append(" from vou_details"); sb.append(" where"); sb.append(" vou_type = ? and"); sb.append(" LPAD(trim(start_seq_no),15,'0') between ? and ? and"); sb.append(" status = 0"); log.debug(sb.toString()); SQLQuery s = session.createSQLQuery(sb.toString()); s.addScalar("vou_type", Hibernate.INTEGER); s.addScalar("start_seq_no", Hibernate.LONG); s.addScalar("end_seq_no", Hibernate.LONG); s.setInteger(0, vou_type); s.setLong(1, new Long(start_seq_no)); s.setLong(2, new Long(end_seq_no)); return s.list(); } or hql: /** 取得对象 **/ Object[] values = {vou_type, new Long(start_seq_no), new Long(end_seq_no)}; List list = getHibernateTemplate().find("from VouDetail where vou_type=? and LPAD(trim(start_seq_no),15,'0') between ? and ? and status='0'", values); |
|
| 返回顶楼 | |
|
时间:2008-04-29
把
LPAD(trim(start_seq_no),15,'0') between ? and ? 改成 LPAD(trim(start_seq_no),15,'0') >= ? and LPAD(trim(start_seq_no),15,'0') <= ? 试试? |
|
| 返回顶楼 | |
|
时间:2008-04-30
你要先看看LPAD这个函数hql是不是支持,我google了一下感觉是不支持的.
如果不支持就只能用sqlquery实现啦. |
|
| 返回顶楼 | |
|
时间:2008-05-01
我也觉得你的HQL语句写的不是很标准
|
|
| 返回顶楼 | |
|
时间:2008-05-01
完全对象化后,HQL是不是用的很好啦
|
|
| 返回顶楼 | |
|
时间:2008-05-01
完全对象化后,HQL是不是用的很少啦
|
|
| 返回顶楼 | |







