前几次我们讲了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。
查询的我们先大概了解到这里,下次我们再一起学习一下分页的实现。
分享到:
相关推荐
### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...
这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友
Hibernate条件查询Criteria.docHibernate条件查询Criteria.doc
Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...
### Hibernate-Criteria 模糊查询详解 在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的...
Hibernate条件查询Criteria[参考].pdf
本篇内容将聚焦于Hibernate中的Criteria查询,这是一种动态构建SQL查询的方法,无需直接编写SQL语句,非常适合在程序运行时根据条件构建查询。 在Hibernate中,Criteria API提供了一种类型安全的方式来执行查询,它...
Hibernate 的 Criteria 是一个完全面向对象、可扩展的条件查询 API,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何实现。Criteria 提供了灵活的查询条件组装方式,能够满足开发中复杂的查询需求。 一、...
在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以对象化的方式构建SQL语句,而无需直接编写SQL代码。本篇将详细讲解如何在Hibernate中利用Criteria查询来实现类似SQL...
### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...
- **Criteria API**:是Hibernate提供的一种灵活且强大的查询方式,允许开发者通过程序化的方式来构建查询条件。 - **Order**:用于表示排序规则的对象,包含升序(asc)和降序(desc)两种类型。 - **Criteria....
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
通过上述介绍,我们可以看到,Hibernate的Criteria API提供了一个强大且灵活的数据查询解决方案,它不仅支持基本的查询需求,还能处理复杂的查询场景,如排序、分页、聚合函数、分组统计以及条件过滤等。这使得开发...
Hibernate Criteria 是一种在Java应用程序中使用Hibernate ORM框架执行SQL查询的方式。它提供了一种面向对象的方式来构建查询,使得代码更加可读和易于维护。Criteria API 提供了多种方法来构建复杂的查询,包括添加...
在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...
Hibernate 中 Criteria 的使用是 Hibernate 框架中的一种查询机制,对于研究 Hibernate 源码有一些作用。在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装。 Criteria 是 Hibernate 中的...