`
wangflood
  • 浏览: 41560 次
  • 性别: Icon_minigender_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是多么正常。就像这样。


那么数据库感知到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的网站界面难看,编辑页设计也太差了。坑爹的提问积分制度。分数低了,没人愿意回答你。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 9.8 KB
0
4
分享到:
评论
1 楼 finallygo 2011-05-23  
1.不知道返回什么,你调试一下不就知道了?
2.hql不支持rand()吗?但是我用了一下,可以用啊(我用的是MySQL5InnoDBDialect)
3.就算不支持,不是可以自己添加自定义函数吗?

相关推荐

    spring+hibernate整合实现简单数据库添加记录

    本文将深入探讨如何将Spring与Hibernate整合,以实现对数据库的简单添加记录功能,这对于初学者来说是一次宝贵的学习机会。 首先,我们需要理解Spring的核心概念。Spring提供了一个依赖注入(DI)容器,它负责管理...

    Hibernate实时获取数据库更新记录jar包

    Hibernate实时获取数据库更新记录jar包, 内含:c3p0-0.9.1.2.jar,hibernate-c3p0-4.2.0.Final.jar,mchange-commons-java-0.2.3.4.jar

    HIbernate-tools修改记录

    本文将深入探讨Hibernate-tools的修改记录,帮助开发者更好地理解和应用这一工具。 一、Hibernate-tools概述 Hibernate-tools是Hibernate项目的一个子模块,它扩展了Hibernate的核心功能,提供了诸如代码生成、...

    hibernate第一个hibernate

    《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。

    Hibernate实践例子程序

    2) 数据O/R mapping 配置文件,也就是数据库中每一条记录的详细说明,包括field, PrimaryKey等。*.hbm.xml,*一般用映射到该类记录的Class的名称表示。 ------------------------ ...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

    hibernate系列(一)hibernate入门

    例如,插入一条新的用户记录: ```java Transaction tx = session.beginTransaction(); User user = new User("admin", "123456"); session.save(user); tx.commit(); ``` 查询操作则可以使用HQL(Hibernate Query...

    hibernate之一对多配置demo

    在数据库中,这对应于一个表(如班级表)有一条记录可以关联多条记录(如学生表)。在Hibernate中,我们通过配置XML文件来定义这种关系。 1. XML配置一对多关系: 在Hibernate的映射文件中,我们需要为两个实体...

    hibernate的一个简单例程

    Hibernate通过将Java类与数据库表之间的映射关系定义在XML配置文件或注解中,实现了对象与数据库记录之间的自动转换,降低了数据库操作的复杂性。 **知识点二:环境配置** 在开始使用Hibernate之前,需要确保以下...

    hibernate annotation hibernate3

    `@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条记录。例如: ```java @Entity public class User { //... } ``` 2. 主键注解:`@Id` `@Id`注解用于指定实体类中的主键字段,...

    hibernate3 hibernate3

    Hibernate3 是一个强大的Java持久化框架,用于简化数据库与对象之间的交互。它是对象关系映射(ORM)工具的典范,允许开发人员使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。在本篇文章中,我们将...

    Hibernate Hibernate5 讲义 PDF

    Hibernate使用配置好的映射文件和主配置文件,在运行时自动将数据对象转换成数据库中的记录,并且可以将数据库记录转换回数据对象。Hibernate的懒加载、缓存策略以及事务管理等高级特性,使得它能高效地与关系型...

    Hibernate-extensions 完整安装包

    Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要讨论的Hibernate-Extensions。这个...

    Hibernate入门到精通

    Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...

    Hibernate 配置各种数据库

    Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...

    Hibernate教程05_关系映射之一对一双向外键关联

    在数据库设计中,当两个表之间存在一对一的关系,即每个表的记录最多只能与另一个表的一条记录相对应,这时我们说它们之间是一对一关系。例如,一个人可能只有一个身份证,而身份证也只属于一个人,这就是典型的“一...

    hibernate aip hibernate aip

    Hibernate AIP,全称为Hibernate Application Integration Process,是Java开发领域中使用Hibernate框架进行应用程序集成的一种实践过程。Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用...

    Hibernate3笔记个人记录

    【Hibernate3笔记个人记录】 Hibernate 是一款强大的Java对象关系映射(ORM)框架,它将数据库操作抽象化,使得开发者可以使用面向对象的方式来处理数据库事务,而无需关注底层的SQL语句。本笔记将深入探讨...

    Hibernate构建一个CURD的程序

    2. 也可以通过HQL或Criteria API执行删除操作,根据条件删除满足条件的多条记录。 在Chapter01中,你可能会找到以下内容: - Hibernate的基本环境搭建,包括添加依赖、配置数据库连接等。 - 实体类的设计与注解,如...

Global site tag (gtag.js) - Google Analytics