`
pengfeifei26
  • 浏览: 245378 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

hibernate查询

 
阅读更多
hibernate 查询
criteria 查询:http://blog.csdn.net/xingtianyiyun/article/details/7703429
http://www.cnblogs.com/JemBai/archive/2010/01/06/1640636.html



hibernate的get和load区别
分类: hibernate 2012-11-15 00:15 261人阅读 评论(0) 收藏 举报
1、延迟加载:load是true而get是false,意思就是 load采用的是延迟加载的方式 而get不是,也就是说get()采用立即加载方式,而load()采用延迟加载;,hibernate思想是 既然这个方法支持延迟加载 他就认为这个对象一定在数据库存在
2、load方法的加载过程:
                         例如:Student     stu = session.load(Student.class,id);执行此条程序,hibernate的执行过程:
                                    1.查询session缓存:先查一下session缓存,看看该id对应的对象是否存在
                                    2.缓存中没有这个对象 就创建个代理
                                    因为延迟加载需要代理来执行 所以就创建了个代理,ok 到此为止 这句话就执行完了,这个 并没有去数据库交互查询
                                   当你使用这个对象 比如stu.getName()或get()方法时候,此时才会触发sql语句
                                   这个时候 hibernate就去查询二级缓存和数据库,数据库没有这条数据 就抛出异常ObjectNotFoundException
3、get方法的加载过程:因为hibernate规定get方法不能使用延迟加载 所以和load还是不一样的,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
                         例如:Student     stu = session.get(Student.class,id);执行此条程序,hibernate的执行过程:
                                   1、get方法首先查询session缓存 (session缓存就是hibernate的一级缓存 这个概念大家应该清楚吧 )
                                   2、get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
                                   3、get方法如果在session缓存中找到了该id对应的对象,并且不是被延迟加载的代理对象,或者在session缓存中没有找到该对象,则查找二级缓存,再没有就查找数据库,返回的对象为实体对象,如果都没有找到,则返回null
(这个代理实际就是空的对象 并没有去数据库查询得到的 我们叫代理对象,如果 去数据库查询了 返回到了这个对象 我们叫实体对象 就是这个对象真实存在)

我在总结性一句话这2者区别
get方法首先查询session缓存,没有的话直接发送sql查询数据库,一定要获取到真实的数据,否则返回null,并不适用二级缓存;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,就抛异常

//hql直接使用
//			String hql = "select a from UrsMember a , UrsMemberInfo b where a.memberId = b.memberId and a.username like '%"+username+ "%' order by a.memberId desc";
//			String countHql = "select count(*) from UrsMember a, UrsMemberInfo b where a.memberId = b.memberId and a.username like '%"+username+"%'" ;
//			ps = findWithPagination(countHql, hql, ps);
//hql占位符
			String hql = "select a from UrsMember a , UrsMemberInfo b where a.memberId = b.memberId and a.username like ? order by a.memberId desc";
			String countHql = "select count(*) from UrsMember a, UrsMemberInfo b where a.memberId = b.memberId and a.username like ?" ;
			ps=findWithPagination(countHql, hql, ps, new Object[]{"%"+username+"%"});
//sql
//			String sql = "select a.* from urs_member a , urs_member_info b where a.member_id = b.member_id and a.username like ? order by a.member_id desc";

//			String countSql = "select count(*) from urs_member a , urs_member_info b  where a.member_id = b.member_id and a.username like ?" ;
//			ps= findWithPagination_sql(countSql, sql, ps, new Object[]{"%"+username+"%"});




 /**
     * 根据hql和数据总条数分页得到数据
     * @param hql hql语句
     * @param maxCount 数据总条数
     * @param ps 包含起始数据行数和每页行数的PageSupport对象
     * @param values 需要set给Query占位符的参数,数组顺序需和占位符顺序一致
     * @return 包含数据(items)和总数据条数目的PageSupport对象
     */
    protected <T> PageSupport<T> findWithPagination(String hql,Integer maxCount,PageSupport<T> ps,Object[] values){
    	Session session = getSession();
    	if(maxCount==null || hql==null || hql.equals("")){
    		return null;
    	}
		ps.setTotalCount(maxCount.intValue());

		Query query = session.createQuery(hql);
		if (values != null) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i, values[i]);
			}
		}
		List items = query.setFirstResult(ps.getStartIndex()).setMaxResults(
				ps.getCountOnEachPage()).list();
		ps.setItems(items);

		return ps;  
    }   
    
    /**
     * 根据sql和数据总条数分页得到数据
     * @param sql sql语句
     * @param maxCount 数据总条数
     * @param ps 包含起始数据行数和每页行数的PageSupport对象
     * @param values 需要set给Query占位符的参数,数组顺序需和占位符顺序一致
     * @return 包含数据(items)和总数据条数目的PageSupport对象
     */
    protected <T> PageSupport<T> findWithPagination_sql(String sql,Integer maxCount,PageSupport<T> ps,Object[] values){
    	Session session = getSession();
    	if(maxCount==null || sql==null || sql.equals("")){
    		return null;
    	}
		ps.setTotalCount(maxCount.intValue());

		Query query = session.createSQLQuery(sql);
		if (values != null) {
			for (int i = 0; i < values.length; i++) {
				query.setParameter(i, values[i]);
			}
		}
		List items = query.setFirstResult(ps.getStartIndex()).setMaxResults(
				ps.getCountOnEachPage()).list();
		ps.setItems(items);

		return ps;  
    }   
    

 /**
     * 根据count()的聚合hql语句查询数据总条数
     * @param hql count()聚合Hql,如“SELECT count(*) FROM User”
     * @param values 需要set给Query占位符的参数,数组顺序需和占位符顺序一致
     * @return 数据总条数
     */
    protected Integer getCount(String hql,Object[] values){    	
		try{
			Session session = getSession();
	    	
			Query query = session.createQuery(hql);
			if (values != null) {
				for (int i = 0; i < values.length; i++) {
					query.setParameter(i, values[i]);
				}
			}
			if(query.iterate().hasNext()){
				Long maxCount = ((Long) query.iterate().next());
				if(maxCount==null){
					return 0;
				}else{
					return maxCount.intValue();
				}
			}else{
				return 0;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
    }
    /**
     * 根据count()的聚合sql语句查询数据总条数
     * @param hql count()聚合Hql,如“SELECT count(*) FROM User”
     * @param values 需要set给Query占位符的参数,数组顺序需和占位符顺序一致
     * @return 数据总条数
     */
    protected Integer getCount_sql(String sql,Object[] values){    	
		try{
			Session session = getSession();
			SQLQuery query = session.createSQLQuery(sql);
			if (values != null) {
				for (int i = 0; i < values.length; i++) {
					query.setParameter(i, values[i]);
				}
			}
			if(query.list().size()>0){
				return Integer.parseInt(query.list().get(0).toString());
			}else{
				return 0;
			}

		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
    }
分享到:
评论

相关推荐

    struts+hibernate查询所有记录

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

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    Hibernate查询练习小例子

    利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~

    Hibernate查询语言HQL.PPT

    Hibernate 查询语言 HQL Hibernate 查询语言 HQL 是一种面向对象的查询语言,用于检索对象。它提供了灵活多样的查询机制,包括导航对象图、通过标识符检索、使用 HQL 检索对象、使用 Hibernate 条件 API 和使用本地...

    Hibernate查询映射试验

    本实践项目“Hibernate查询映射试验”旨在通过一系列示例帮助开发者掌握Hibernate中的查询映射技术,包括HQL(Hibernate Query Language)和Criteria API。 首先,Hibernate的核心是对象关系映射(ORM),它允许...

    hibernate查询缓存1

    在深入探讨Hibernate查询缓存之前,我们先了解一下Hibernate的基础概念。Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射(ORM)功能。在Hibernate中,对象的状态分为瞬时态、持久态...

    hibernate查询代码

    最后,`hibernate查询`这个压缩包可能包含了一些示例代码和配置文件,用于演示如何在Java项目中实现上述查询方式。通过分析这些文件,你可以更好地理解Hibernate查询的工作原理,并将其应用到自己的项目中。 总之,...

    Hibernate查询缓存及实现.PPT

    【标题】:“Hibernate查询缓存及实现.PPT” 【描述】:“Hibernate查询缓存及实现.PPT” 在本文中,我们将深入探讨Hibernate框架中的查询缓存机制及其实施步骤,这是一项旨在提高应用程序性能的重要功能。查询...

    Hibernate查询语言HQL

    Hibernate查询语言HQL

    Hibernate查询语句写在配置文件中

    【标题】:“Hibernate查询语句写在配置文件中” 【正文】: Hibernate 是一个流行的 Java 应用程序框架,主要用于简化数据库操作。它提供了一种对象关系映射(ORM)机制,将数据库操作转化为对 Java 对象的操作,...

    hibernate查询、连接池、二级缓存

    在“hibernate查询、连接池、二级缓存”这个主题中,我们将深入探讨这三个关键概念。 首先,让我们来了解**Hibernate查询**。Hibernate 提供了丰富的查询方式,包括HQL(Hibernate Query Language)和Criteria API...

    HQL Hibernate查询语言

    HQL Hibernate查询语言,HQL的学习和参考的文档,开发必备。

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    hibernate查询-hql教程

    hibernate查询-hql等教程,对于学习hibernate有很好的帮助。

    hibernate将本地SQL查询结果封装成对象(最终).zip

    Hibernate支持两种类型的查询:原生SQL查询和Hibernate查询语言(HQL)。原生SQL查询允许开发者直接执行SQL语句,而HQL则是面向对象的查询语言,类似于SQL但更接近于Java。 4. 封装SQL查询结果为对象: - `...

    hibernate查询与缓存

    Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。 get...

    注意hibernate查单一字段和查两个以上的字段返回的结果

    "Huikegeneratecodetool"这个文件可能是一个代码生成工具,它能自动生成符合Hibernate查询规则的代码,从而提高开发效率,减少手动编写SQL的错误。 总的来说,理解Hibernate查询中单一字段与多字段的区别对于优化...

Global site tag (gtag.js) - Google Analytics