首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hibernate获得一条随机记录

2012-11-10 
hibernate取得一条随机记录项目中要求随机取得user表的一条记录。用到hibernate,底层数据库是mysql.1.首先

hibernate取得一条随机记录

项目中要求随机取得user表的一条记录。用到hibernate,底层数据库是mysql.

1.首先会想到一种方式:取出数据库中所有的记录,你懂的。一个List,然后list.get(new Random().nextInt(list.size));但显然查询了所有的记录,如果表特别大,效率可想而知。

2.可行的方式,应该是得到一个随机的主键,然后load.原生sql实现的方式是:select * from user order by rand() limit?? 1;插一句,很奇怪,有人说这种方式会慢慢的;还有朋友说这种方式rand()有可能返回null.我没有深入了解数据库的实现,但是我想:数据库对于每插入的一条记录,生成一个index是多么正常。就像这样。


hibernate获得一条随机记录

那么数据库感知到index有存在是多么正常,既然index本身就像一个数组索引,那么得到一条随机记录是多么正常,数据库对于暴露得到一条随机记录又是多么正常。那么对于mysql来说,提供rand()是多么正常。那rand()为什么会返回null.这个API理应由数据库来做,那么效率低又何以见得。。。

?

3.hql居然不支持rand()。createCriteria不太会啊。

?

4.万般无奈,我在dao.impl层写了个方法,调用createSQLQuery。我愚笨,就像这样

(User)getHibernateTemplate().execute(                    new HibernateCallback() {

?居然会报cast Exception,到底返回什么呢,我不知道。又试着强制转换为ResultSet,也是一样的错误。

?

5.幸好的generator id方式比较有规律,是auto_increment的。解决方式是这样的。如下

public User loadRandomUser() throws Exception {int count = countAll("User");User user = null;while (user == null) {int rand = new Random().nextInt(count);final String hql = "from User where privilege=1 and uid = " + rand;user = (User) getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException {Query query = session.createQuery(hql);query.setMaxResults(1);return query.uniqueResult();}});}return user;}

? 首先取得记录的总数。随机得一个uid,然后load。随机取记录,由java来做的,效率肯定比rand()低。

?

求解。。。

?

另外:我发现iteye的网站界面难看,编辑页设计也太差了。坑爹的提问积分制度。分数低了,没人愿意回答你。

?

?

?

?

?

?

?

?

?

?

?

?

?

1 楼 finallygo 2011-05-23   1.不知道返回什么,你调试一下不就知道了?
2.hql不支持rand()吗?但是我用了一下,可以用啊(我用的是MySQL5InnoDBDialect)
3.就算不支持,不是可以自己添加自定义函数吗?

热点排行