`
cxshun
  • 浏览: 724559 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate查询之Criteria

阅读更多

前几次我们讲了hibernate的关联映射,映射完了我们就要开始来查询啦。

首先这一次我们讲一下Criteria查询,这个对于不是太熟悉SQL语句的我们这些程序员来说是很容易上手的。

废话不多说,看一下例子:

实体类如下:

public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	public Long id;
	private String name;
	private int age;
        //省略Get/Set方法
}

  映射文件我们就不写了,很简单的一个实体,如果不懂的童鞋请参照我在hibernate分类中的其他文章。

接下来我们看如何使用Criteria来进行查询:

	public static void main(String[] args) {

		Configuration cfg = new Configuration().configure();
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("name","shun"));
		
		List list = criteria.list();
		Iterator iter = list.iterator();
		while(iter.hasNext()) {
			User user = (User)iter.next();
			System.out.println(user.getName()+":"+user.getAge());
		}
		
		session.close();
	}

  看到代码,很简单的一串。

前面都很熟悉啦,我们看到构造session之后的代码:

Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("name","shun"));

  这两句代码是重点,我们来分析一下,究竟是什么意思?

第一句我们通过session得到Criteria实现类的一个对象,接着第二句我们通过add方法添加一个条件,eq表示相等。在Hibernate3以前是通过Expression.eq来实现,3之后由于Criteria被抛弃,我们改用Restrictions类来实现,它和Expression一样的用法。我们看看API发现Expression继承于Restrictions。

回到我们上面的两句,我们做完这些工作后,实际上hibernate帮我们构造了类似

select * from user where name='shun'

  这样的语句。(这里我们映射文件中User类对应的表是user表,而name属性对应的是name字段)

 

Restrictions还有许多帮助我们构造SQL语句的方法,大家查一下API很容易就可以理解了。

 

我们重新看一下上面的代码,如果我们关闭了session,但是我们想继续使用这个criteria,行吗?我们来看一下。

在上面的代码之后,我们重新遍历,加上:

List list2 = criteria.list();
Iterator iter2 = list.iterator();
while(iter.hasNext()) {
	User user = (User)iter.next();
	System.out.println(user.getName()+":"+user.getAge());
}

  为了区分跟上一个list和iter的区别,我们这里用另外一个。

运行它,我们得到的是一个异常:

org.hibernate.SessionException: Session is closed!

  报这个异常表示session已经关闭,很多情况下我们在关闭了session再进行saveOrUpdate,save等跟持久化相关的操作都会报类似的异常。

Hibernate3考虑到了我们这个需求,它实现了一个DetachedCriteria,这个可以独立于Session而存在。

我们来看一下例子:(实体还是上面的)

public static void main(String[] args) {
		
		Configuration cfg = new Configuration().configure();
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		DetachedCriteria decriteria = DetachedCriteria.forClass(User.class);
		decriteria.add(Restrictions.eq("name","shun"));
		
		List list = decriteria.getExecutableCriteria(session).list();
		Iterator iter = list.iterator();
		while(iter.hasNext()) {
			User user = (User)iter.next();
			System.out.println(user.getName()+":"+user.getAge());
		}
		
		session.close();
		
		Session session2 = sessionFactory.openSession();
		List list2 = decriteria.getExecutableCriteria(session2).list();
		Iterator iter2 = list2.iterator();
		while(iter2.hasNext()) {
			User user = (User)iter2.next();
			System.out.println(user.getName()+":"+user.getAge());
		}
	}

  我们看到在session关闭之后,我们在另外一个连接中还是可以继续用DetachedCriteria。我们需要通过getExecutableCriteria(Session session)把当前的DetachedCriteria跟某一个Session进行关联。

 

 

接下来我们再来看一下Subqueries类与DetachedCriteria的结合使用:

public static void main(String[] args) {
		
		Configuration cfg = new Configuration().configure();
		SessionFactory sessionFactory = cfg.buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		DetachedCriteria decriteria = DetachedCriteria.forClass(User.class);
		decriteria.setProjection(Projections.avg("age"));
		
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Subqueries.propertyGt("age",decriteria));
		List list = criteria.list();
		Iterator iter = list.iterator();
		while(iter.hasNext()) {
			User user = (User)iter.next();
			System.out.println(user.getName()+":"+user.getAge());
		}
		
		session.close();
		
	}

  估计大家有疑问的应该是第一句代码:

decriteria.setProjection(Projections.avg("age"));

  这句代码是指通过decriteria得到age的平均值。然后在下面取得大于平均值的age的对象。

Projections包含了许多实现SQL方法的封装方法,大家可以看一下API。

查询的我们先大概了解到这里,下次我们再一起学习一下分页的实现。

1
0
分享到:
评论

相关推荐

    hibernateCriteria查询

    ### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    Hibernate条件查询Criteria.doc

    Hibernate条件查询Criteria.docHibernate条件查询Criteria.doc

    Hibernate中Criteria的完整用法

    Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...

    Hibernate-Criteria_模糊查询

    在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...

    Hibernate的Criteria用法总结

    在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...

    Hibernate-Criteria 模糊查询

    ### Hibernate-Criteria 模糊查询详解 在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的...

    Hibernate条件查询Criteria[参考].pdf

    Hibernate条件查询Criteria[参考].pdf

    Criteria hibernate

    本篇内容将聚焦于Hibernate中的Criteria查询,这是一种动态构建SQL查询的方法,无需直接编写SQL语句,非常适合在程序运行时根据条件构建查询。 在Hibernate中,Criteria API提供了一种类型安全的方式来执行查询,它...

    Hibernate的Criteria用法总结.doc

    Hibernate 的 Criteria 是一个完全面向对象、可扩展的条件查询 API,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何实现。Criteria 提供了灵活的查询条件组装方式,能够满足开发中复杂的查询需求。 一、...

    Hibernate中,利用Criteria查询容器实现sql的写法

    在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以对象化的方式构建SQL语句,而无需直接编写SQL代码。本篇将详细讲解如何在Hibernate中利用Criteria查询来实现类似SQL...

    hibernate criteria 分组 排序 关联

    ### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...

    Hibernate Criteria 排序的問題

    - **Criteria API**:是Hibernate提供的一种灵活且强大的查询方式,允许开发者通过程序化的方式来构建查询条件。 - **Order**:用于表示排序规则的对象,包含升序(asc)和降序(desc)两种类型。 - **Criteria....

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    Hibernate中的Criteria的认识

    通过上述介绍,我们可以看到,Hibernate的Criteria API提供了一个强大且灵活的数据查询解决方案,它不仅支持基本的查询需求,还能处理复杂的查询场景,如排序、分页、聚合函数、分组统计以及条件过滤等。这使得开发...

    Hibernate criteria基本操作

    Hibernate Criteria 是一种在Java应用程序中使用Hibernate ORM框架执行SQL查询的方式。它提供了一种面向对象的方式来构建查询,使得代码更加可读和易于维护。Criteria API 提供了多种方法来构建复杂的查询,包括添加...

    Hibernate的Criteria文档

    在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...

    Hibernate中Criteria的使用

    Hibernate 中 Criteria 的使用是 Hibernate 框架中的一种查询机制,对于研究 Hibernate 源码有一些作用。在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装。 Criteria 是 Hibernate 中的...

Global site tag (gtag.js) - Google Analytics