论坛首页 Java版 Hibernate

一个比较困扰的问题。

浏览 1044 次
精华帖 (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 ?";
,但是不报错。很是奇怪,不知哪位遇到相似情况?如何解决的?(数据库字段类型不能更改),望不吝赐教。
谢谢!
   
时间:2008-04-29
不使用HQL,试试用session.createSQLQuery方法创建Query对象来查询
   
0 请登录后投票
时间: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?
   
0 请登录后投票
时间:2008-04-29
用p6spy查看一下程序向数据库发送的真实SQL语句是什么。
   
0 请登录后投票
时间: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);
   
0 请登录后投票
时间: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') <= ?

试试?
   
0 请登录后投票
时间:2008-04-30
你要先看看LPAD这个函数hql是不是支持,我google了一下感觉是不支持的.
如果不支持就只能用sqlquery实现啦.
   
0 请登录后投票
时间:2008-05-01
我也觉得你的HQL语句写的不是很标准
   
0 请登录后投票
时间:2008-05-01
完全对象化后,HQL是不是用的很好啦
   
0 请登录后投票
时间:2008-05-01
完全对象化后,HQL是不是用的很少啦
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛: