项目中要求随机取得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
分享到:
相关推荐
本文将深入探讨如何将Spring与Hibernate整合,以实现对数据库的简单添加记录功能,这对于初学者来说是一次宝贵的学习机会。 首先,我们需要理解Spring的核心概念。Spring提供了一个依赖注入(DI)容器,它负责管理...
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项目的一个子模块,它扩展了Hibernate的核心功能,提供了诸如代码生成、...
《Hibernate入门:初识与实践》 ...总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。通过实践,你可以逐步熟悉ORM思想,为后续的Java开发奠定坚实的基础。
2) 数据O/R mapping 配置文件,也就是数据库中每一条记录的详细说明,包括field, PrimaryKey等。*.hbm.xml,*一般用映射到该类记录的Class的名称表示。 ------------------------ ...
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...
例如,插入一条新的用户记录: ```java Transaction tx = session.beginTransaction(); User user = new User("admin", "123456"); session.save(user); tx.commit(); ``` 查询操作则可以使用HQL(Hibernate Query...
在数据库中,这对应于一个表(如班级表)有一条记录可以关联多条记录(如学生表)。在Hibernate中,我们通过配置XML文件来定义这种关系。 1. XML配置一对多关系: 在Hibernate的映射文件中,我们需要为两个实体...
Hibernate通过将Java类与数据库表之间的映射关系定义在XML配置文件或注解中,实现了对象与数据库记录之间的自动转换,降低了数据库操作的复杂性。 **知识点二:环境配置** 在开始使用Hibernate之前,需要确保以下...
`@Entity`注解用于标记一个Java类为数据库中的实体表,每个实例对应表中的一条记录。例如: ```java @Entity public class User { //... } ``` 2. 主键注解:`@Id` `@Id`注解用于指定实体类中的主键字段,...
Hibernate3 是一个强大的Java持久化框架,用于简化数据库与对象之间的交互。它是对象关系映射(ORM)工具的典范,允许开发人员使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。在本篇文章中,我们将...
Hibernate使用配置好的映射文件和主配置文件,在运行时自动将数据对象转换成数据库中的记录,并且可以将数据库记录转换回数据对象。Hibernate的懒加载、缓存策略以及事务管理等高级特性,使得它能高效地与关系型...
Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要讨论的Hibernate-Extensions。这个...
Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 Hibernate 是一个开源的...
Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等信息。 配置 Hibernate 连接...
在数据库设计中,当两个表之间存在一对一的关系,即每个表的记录最多只能与另一个表的一条记录相对应,这时我们说它们之间是一对一关系。例如,一个人可能只有一个身份证,而身份证也只属于一个人,这就是典型的“一...
Hibernate AIP,全称为Hibernate Application Integration Process,是Java开发领域中使用Hibernate框架进行应用程序集成的一种实践过程。Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用...
【Hibernate3笔记个人记录】 Hibernate 是一款强大的Java对象关系映射(ORM)框架,它将数据库操作抽象化,使得开发者可以使用面向对象的方式来处理数据库事务,而无需关注底层的SQL语句。本笔记将深入探讨...
2. 也可以通过HQL或Criteria API执行删除操作,根据条件删除满足条件的多条记录。 在Chapter01中,你可能会找到以下内容: - Hibernate的基本环境搭建,包括添加依赖、配置数据库连接等。 - 实体类的设计与注解,如...