Java的Hibernate框架中Criteria查询使用的实例讲解

 更新时间:2016年01月04日 08:44:36   作者:cxshun  
这篇文章主要介绍了Java的Hibernate框架中Criteria查询使用的实例讲解,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下

我们讲一下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。

下面我们来了解一下它的稍微高级点的用法。
 直接看代码吧:

criteria.setFirstResult(10); 
criteria.setMaxResults(20); 

  这里我们设置了开始的记录是第10条,然后从第10条开始查出20条记录,根据这个做法,我们就可以实现基本的分页功能了。
 当然,我们在很多情况下都需要排序,criteria也是支持的:

 criteria.addOrder(Order.desc("age")); 

  这里,我们直接用addOrder方法即可,里面通过Order.desc得到一个Order对象,它需要一个属性参数。实际上当我们调用addOrder时,hibernate会帮我们生成order by age,这样的语句。
 
 当我们需要进行分组时,这个怎么做呢?这个就需要用到我们上次有涉及到的Projections这个类的groupProperty方法,
 

criteria.setProjection(Projections.groupProperty("age")); 

  这里我们就根据age属性来进行分组,实际上也就是通过age对应的字段age进行分组,hibernate会自动帮我们转换成group by age这样的语句。
Projections中有许多实用的方法(注意,此为是hibernate 3后才有的)。  
 

相关文章

  • java中replaceAll替换圆括号实例代码

    java中replaceAll替换圆括号实例代码

    正则表达式的保留字符主要有:圆括号、方括号、花括号、竖线、横线、点号、加号、星号、反斜杆等等,下面这篇文章主要给大家介绍了关于java中replaceAll替换圆括号的相关资料,需要的朋友可以参考下
    2022-10-10
  • 简述Mybatis增删改查实例代码

    简述Mybatis增删改查实例代码

    本文给大家分享编写一个简单的mybatis进行插入数据的实例代码,非常不错具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-10-10
  • java web开发中大量数据导出Excel超时(504)问题解决

    java web开发中大量数据导出Excel超时(504)问题解决

    开发测试时候导入数据遇到大数据导入的问题,整理了下,需要的朋友可以参考下
    2017-04-04
  • Java实现简单的迷宫游戏详解

    Java实现简单的迷宫游戏详解

    迷宫游戏作为经典的小游戏,一直深受大家的喜爱。本文小编将为大家详细介绍一下如何用Java实现一个简单的迷宫小游戏,感兴趣的可以动手试一试
    2022-02-02
  • 图解红黑树及Java进行红黑二叉树遍历的方法

    图解红黑树及Java进行红黑二叉树遍历的方法

    红黑树问题是各大计算机考研命题以及面试算法题目中的热门,接下来我们为大家图解红黑树及Java进行红黑二叉树遍历的方法,需要的朋友可以参考下
    2016-05-05
  • java中-jar 与nohup的对比

    java中-jar 与nohup的对比

    这篇文章主要介绍了java中 -jar 与nohup的对比的相关资料,需要的朋友可以参考下
    2017-05-05
  • skywalking分布式服务调用链路追踪APM应用监控

    skywalking分布式服务调用链路追踪APM应用监控

    这篇文章主要为大家介绍了skywalking分布式服务调用链路追踪APM应用监控的功能使用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • java实现一致性hash算法实例代码

    java实现一致性hash算法实例代码

    这篇文章主要给大家介绍了关于java实现一致性hash算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java数据结构之线段树中的懒操作详解

    Java数据结构之线段树中的懒操作详解

    对于线段树,若要求对区间中的所有点都进行更新,可以引入懒操作。懒操作包括区间更新和区间查询操作。本文将通过一个示例和大家详细聊聊线段树中的懒操作,需要的可以参考一下
    2022-10-10
  • java观察者模式实现和java观察者模式演化

    java观察者模式实现和java观察者模式演化

    观察者模式是经典设计模式中很常用的一种,平常我们看到的监听器,基本上都是采用这种设计模式实现的,这里探讨一下观察者模式的演化
    2014-02-02

最新评论