- 浏览: 457956 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
飞天奔月:
我来个简单点的代码 使用 LinkedHashSetpubli ...
ArrayList去重 -
飞天奔月:
public static <T> List< ...
ArrayList去重 -
aaron7524:
事务隔离级别 -
月陨殇:
wlh269 写道rswh110 写道lz内容写的不错,就是略 ...
事务隔离级别 -
lnx1824:
我的更奇怪,在本地静态的可以,放jetty里的页面后就不然,都 ...
JS得到上传图片尺寸
实体对象查询(重要)
* N+1问题,在默认情况下使用query.iterate查询,有可能出现N+1问题,所谓的N+1
是查询对象的时候发出了N+1条sql语句
1:首先发出一条查询id列表的sql
N:根据id列表发出n条查询语句
* list和iterate的区别?
* list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据
* iterate在默认情况下有N+1问题,如果缓存中存在数据那么会根据id到缓存获取数据
也就说iterate是利用缓存的
参见:SimpleObjectQueryTest1.java,SimpleObjectQueryTest2.java
* N+1问题,在默认情况下使用query.iterate查询,有可能出现N+1问题,所谓的N+1
是查询对象的时候发出了N+1条sql语句
1:首先发出一条查询id列表的sql
N:根据id列表发出n条查询语句
* list和iterate的区别?
* list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据
* iterate在默认情况下有N+1问题,如果缓存中存在数据那么会根据id到缓存获取数据
也就说iterate是利用缓存的
参见:SimpleObjectQueryTest1.java,SimpleObjectQueryTest2.java
package com.wlh.hibernate; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Query; import org.hibernate.Session; public class SimpleObjectQueryTest1 extends TestCase{ public void testQuery1(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句 Query query=session.createQuery("from Student"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery2(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句,实体类可以加别名 Query query=session.createQuery("from Student s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery3(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //可以省略select语句,实体类可以用as加别名 Query query=session.createQuery("from Student as s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery4(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //返回值为实体对象的集合 //使用select查询实体对象,必须采用别名 Query query=session.createQuery("select s from Student as s"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } } package com.wlh.hibernate; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import org.hibernate.Query; import org.hibernate.Session; public class SimpleObjectQueryTest2 extends TestCase{ /** * 发出list查询 */ public void testQuery1(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); /** * 采用list查询将会发出一条查询语句,取得Student数据 * select student0_.id as id1_, student0_.name as name1_, * student0_.createTime as createTime1_, student0_.classesid as classesid1_ * from t_student student0_ * */ Query query=session.createQuery("from Student"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 出现N+1问题 * * 发出查询id类表的sql语句: * select student0_.id as col_0_0_ from t_student student0_ * * 依次发出根据id查询Student的sql语句: * select student0_.id as id1_0_, student0_.name as name1_0_, * student0_.createTime as createTime1_0_, student0_.classesid as classesid1_0_ * from t_student student0_ where student0_.id=? * */ public void testQuery2(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query=session.createQuery("from Student"); Iterator iter=query.iterate(); while(iter.hasNext()){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 先发出list查询,再发出iterate查询 */ public void testQuery3(){ Session session=null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Query query=null; query=session.createQuery("from Student"); List students=query.list(); for(Iterator iter=students.iterator();iter.hasNext();){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } System.out.println("==============================="); /** * 不会出新N+1问题 * * 因为list操作已经将对象放到了一级缓存中(session级缓存),所以在使用Iterate操作的时候 * 它会发出根据id查询的语句,取得id列表,再根据id到缓存中获取数据,只有在缓存中找不到相应的数据 * 才会发出sql语句到数据库中查询 */ query=session.createQuery("from Student"); Iterator iter=query.iterate(); while(iter.hasNext()){ Student student=(Student)iter.next(); System.out.println("student="+student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 发出两次list查询 */ public void testQuery4() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List students = session.createQuery("from Student").list(); for (Iterator iter =students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } System.out.println("------------------------------------------------"); /** * 再次发出查询语句 * * 在默认情况下list每次都会向数据库发出查询对象的sql,除非配置了查询缓存,所以下面的list * 操作,虽然在一级缓存中已经有了对象数据,list不会利用缓存中的数据,而再次发出查询sql * * list在默认情况下,只向缓存中放入数据,而不利用缓存中的数据 */ students = session.createQuery("from Student").list(); for (Iterator iter =students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
发表评论
-
java开发实战视频详解
2017-07-02 08:09 519java开发实战视频详解 链接: http://pan.bai ... -
什么样的数据适合存放到第二级缓存中
2009-04-11 17:15 1712(一)Hibernate的二级缓存策略的一般过程如下: 1) ... -
hibernate二级缓存攻略
2009-04-10 18:13 973http://www.iteye.com/topic/1890 ... -
关于hibernate缓存的问题
2009-04-10 18:12 10401. 关于hibernate缓 ... -
get方法和load方法区别
2009-04-03 18:38 1380hibernate中get方法和load方法的根本区别在于:如 ... -
Hibernate性能调优(重点理解)
2009-03-02 12:48 1263一。 inverse = ? inv ... -
hibernate查询缓存
2009-03-02 11:17 3762hibernate查询缓存 查询缓存是缓存普通属性结果集 ... -
浅谈hibernate性能优化的几点建议
2009-02-21 11:15 1002浅谈hibernate性能优化的几点建议 1、针对orac ... -
Hibernate抓取策略
2009-02-17 12:37 1358hibernate抓取策略(单端代理的批量抓取) 保持< ... -
Hibernate二级缓存的使用
2009-02-17 12:22 10401.加入ehcase.xml文件; 2.在配置文件中加入如下代 ... -
Hibernate一级缓存
2009-02-03 02:57 913一级缓存生命周期很短,它session的生命周期一致,一级缓存 ... -
HQL (十) 统计查询
2009-02-02 18:28 2345统计查询(重要) 参见:StatQueryTest.java ... -
HQL (九) 连接查询
2009-02-02 18:25 6117连接查询(重要) * 内连接 * 外连接(左连接/右连接) ... -
HQL (八) 对象导航查询
2009-02-02 13:17 2111对象导航查询,在hql中采用.进行导航(重要) 参见:Obj ... -
HQL (七) 分页查询
2009-02-02 13:05 1198分页查询(重要) * setFirstResult(),数据 ... -
HQL (六) 查询过滤器
2009-02-02 12:22 1853查询过滤器 设置了查 ... -
HQL (五) 外置命名查询(sql语句单独保存起来)
2009-02-02 12:04 2301外置命名查询 * 在要查询对象对应的映射文件(这里是stud ... -
HQL (四) 原生sql查询
2009-02-02 11:27 1862hibernate也支持直接sql进行查询 参见:SqlQu ... -
HQL (三) 条件查询
2009-02-02 11:13 2584条件查询(重要) * 可以采用拼字符串的方式传递参数 * ... -
HQL (一) 简单属性查询
2009-02-02 01:13 1925简单属性查询(重要) * 单一属性查询,返回结果集是属性列表 ...
相关推荐
#### 二、实体查询的高级用法 除了基本的实体查询之外,HQL还支持更复杂的查询,例如: - **查询所有对象**: ```java hql = "from java.lang.Object"; ``` 这条语句将会返回数据库中所有表的数据记录。然而...
HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了与SQL类似的功能,但更贴近于面向对象编程的思维方式。HQL允许开发人员以一种更自然的方式查询数据库,同时保持了Java对象模型的一致性。 #### ...
HQL与SQL语法类似,但它理解Java实体和属性,因此HQL查询的对象是Java类而不是数据库中的表。 首先,HQL的基本查询语句包括从特定实体类中查询记录。例如,查询一个名为User的实体类的所有记录,可以使用以下语句:...
在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行数据检索的情况下。例如,在电子商务系统中,我们需要获取用户信息及其相关的订单信息时,就可以利用HQL关联查询来简化这一过程。此外,当...
`Example`是另一种用于查询的方式,主要用于匹配实体对象的某些属性。 ```java Session session = HibernateUtil.getSession(); List<User> users = session.createCriteria(User.class) .add(Example.create(user...
HQL(Hibernate Query Language)是Hibernate框架提供的面向对象的查询语言,它允许开发者用类名和属性名称来执行SQL查询,使得代码更加易读且与数据库无关。本文将深入分析HQL在处理多对多关系时的查询语句及其应用...
HQL是一种面向对象的查询语言,它的语法结构与SQL类似,但更关注于对象和实体,而不是数据库表和列。HQL允许开发者直接操作Java对象,避免了直接编写SQL语句的麻烦,并且支持跨数据库的移植性。 二、HQL模糊查询...
QBC是一种基于实例的查询方式,通过提供一个实体对象实例作为查询的模板,Hibernate会自动根据对象的属性生成相应的查询语句。QBC的主要优势在于它的直观性和简单性。QBC中的运算符与HQL中的对应,例如,通过调用...
第二个示例展示了如何使用 HQL 进行参数化查询。方法名为 `getDutyManOfGroup`,其中 HQL 语句如下: ```java "from syidt.modules.grp.basegrp.persistence.Person as person where person.theGroup.groupOID=?"; `...
### HQL 查询语言基础二 #### 一、FROM 子句 在HQL查询语言中,`FROM`子句用于指定查询数据来源的实体或表。例如: ```hql FROM Person as p ``` 这里的`Person`表示的是一个持久化类,即ORM映射中的实体类。`as...
执行上述HQL语句后,返回的结果将会是一个`List`集合,其中每个元素都是一个对应的实体对象。 ##### 2. 查询单个实体 如果只需要查询表中的某一个实体,可以通过添加`WHERE`子句来实现: ```hql FROM 实体名 ...
FROM子句指定要查询的对象,可以是一个实体类,也可以是多对一、一对多、多对多关联的类。例如: ```sql SELECT c FROM Course c JOIN c.students AS s WHERE s.name = '张三' ``` 此查询将返回所有张三选修的课程...
Hibernate查询之HQL是ORM(对象关系映射)框架Hibernate中的一个重要组成部分,它是一种面向对象的查询语言,与SQL有着显著的区别。HQL允许开发者使用类名和属性而不是表名和列名进行查询,从而更好地适应面向对象的...
在Spring框架与Hibernate技术结合使用时,HQL(Hibernate Query Language)作为对象查询语言被广泛应用于数据查询操作之中。本文将详细解析Spring框架中常用的HQL查询方法及其应用场景。 #### 一、find(String ...
HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是针对对象模型而非关系数据库设计的。HQL允许开发者以类和属性的名称进行查询,而不是表和列名,这使得代码更具可读性和可维护性。例如,你可以通过HQL...
在数据查询方面,Hibernate提供了多种查询方式,其中HQL(Hibernate Query Language)是一种基于SQL的领域查询语言,它允许开发者以面向对象的方式编写查询语句,而无需直接处理复杂的SQL语句。本文将深入探讨...
HQL(Hibernate Query Language)是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它与SQL类似,但专为面向对象编程设计。HQL允许开发者以类和对象的方式编写查询,而不是直接处理数据库表格。 ### 1. ...
- `from`关键字用于指定要查询的对象,`类名`是你希望查询的实体类,`别名`是可选的,可以更方便地引用查询结果中的对象。 2. **条件查询**: `where 条件表达式` - `where`后面可以跟任何合法的条件表达式,包括...