在mysql中并没有类似oracle中的rownum。可有的时候,我们需要获取对应的行数获取来进行相关排序、
实现方法
第一步:
SELECT @rownum:=0 from tableName t
rownum 其意思等同于声明一个变量名(所以可以任意修改),并赋初始值为0!
但是这样的运行结果都是等于0,所以必须用到自增才型
所以需要结合,故
第二步(自增)
select @rownum := @rownum+1 from (SELECT @rownum:=0 from tableName t) t
就可以实现oracle中的rownum
非常感谢 lwpan 的评论。他所说的问题的确存在。如果直接运行上面的SQL语句是会报
Space is not allowed after parameter prefix ':' 异常。
该异常是因为hibernate的jar在4.0以下版本bug导致,4.0以上是没问题的。可以参考
https://hibernate.atlassian.net/browse/HHH-2697
解决办法如下:
1.你所说的hibernate的bug的确存在,但是在4.0以下的版本,所以可以升级hibernate的jar !这点要说明下。其原理您也可以看看这篇文章
https://hibernate.atlassian.net/browse/HHH-2697
2.在网站上有多种解决办法,包括转义,函数,存储过程。其中转义是不可行,函数和存储过程是可以的.
3.以上2种办法虽然都可以解决,但都有很大弊端,第一种,一个项目一般不会因为你一个功能点而去升级一个jar,并且还要考虑到稳定 ,兼容等因素。
第二种,相对于来说好用点,但是,编写函数,存储过程的脚本有时候要给予数据库管理员,这个也麻烦点。
我想说的第三种办法是用hibernate的jdbc去查询,就可以实现!下面是个简单的样例
public List<Object[]> jdbcQuery(final String sql) { return (List<Object[]>) getHibernateTemplate().execute(new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { Connection con = session.connection(); PreparedStatement ps = con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); String sort = null; String building_id = null; int rowNum = 0; List<Object[]> list = new ArrayList<Object[]>(); Object[] obj = null; while(rs.next()){ obj = new Object[1]; rowNum = rs.getInt("rownum"); obj[0] = rowNum ; list.add(obj); } rs.close(); ps.close(); session.flush(); session.close(); return list; } }); }