项目中要求随机取得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 AIP,全称为Hibernate Application Integration Process,是Java开发领域中使用Hibernate框架进行应用程序集成的一种实践过程。Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用...
【Hibernate3笔记个人记录】 Hibernate 是一款强大的Java对象关系映射(ORM)框架,它将数据库操作抽象化,使得开发者可以使用面向对象的方式来处理数据库事务,而无需关注底层的SQL语句。本笔记将深入探讨...
2. 也可以通过HQL或Criteria API执行删除操作,根据条件删除满足条件的多条记录。 在Chapter01中,你可能会找到以下内容: - Hibernate的基本环境搭建,包括添加依赖、配置数据库连接等。 - 实体类的设计与注解,如...
这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如,一个员工可以属于多个部门,但一个部门只有一个经理。本压缩包中的"hibernateM2O_Dan"文件包含了实现...