zoukankan      html  css  js  c++  java
  • Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    转自:http://blog.csdn.net/iijse/article/details/6161143

    HQL查询方式

    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分 页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数 (count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。

    示例:
       1: Session session = SessionFactory.getCurrentSession();
       2: User user = null;
       3: Transaction ts = session.beginTransaction();
       4: try {
       5:     Query query = session.createQuery("from User as u where name='ijse'");
       6:     user= (User) query.list().get(0);
       7:     session.commit();
       8: } catch (HibernateException ex) {
       9:     ts.rollBack();
      10:     ex.printStackTrace();
      11: }
      12: System.out.println(user.getName());

    QBC(Query By Criteria) 查询方式

    这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

    1. 使用Session实例 的createCriteria()方法创建Criteria对象
    2. 使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
    3. 使用Criteria对象的list()方法进行查询并返回结果

    Restrictions类的常用方法:

    方法名称
    描述
    Restrictions.eq 等于
    Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
    Restrictions.gt 大于
    Restrictions.ge 大于等于
    Restrictions.lt 小于
    Restrictions.le 小于等于
    Restrictions.between 对应SQL的between
    Restrictions.like 对应SQL的like
    Restrictions.in 对应SQL的in
    Restrictions.and and关系
    Restrictions.or or关系
    Restrictions.sqlRestriction SQL限定查询

    Order类的常用方法:

    方法名称
    描述
    Order.asc 升序
    Order.desc 降序

    Projections类的常用方法

    方法名称
    描述
    Projections.avg 求平均值
    Projections.count 统计某属性的数量
    Projections.countDistinct 统计某属性不同值的数量
    Projections.groupProperty 指定某个属性为分组属性
    Projections.max 求最大值
    Projections.min 求最小值
    Projections.projectionList 创建一个ProjectionList对象
    Projections.rowCount 查询结果集中的记录条数
    Projections.sum 求某属性的合计
    示例:
       1: Session session = SessionFactory.getCurrentSession();
       2: User user = null;
       3: Transaction ts = session.beginTransaction();
       4: try {
       5:     Criteria criteria = session.createCriteria(User.class);
       6:     criteria.add(Restrictions.eq("name","ijse"));
       7:     user= (User) criteria.list().get(0);    
       8:     session.commit();
       9: } catch (HibernateException ex) {
      10:     ts.rollBack();
      11:     ex.printStackTrace();
      12: }
      13: System.out.println(user.getName());

    QBE(Query By Example)查询方式

    将一个对象的非空属性作为查询条件进行查询。

    示例:
       1: Session session = SessionFactory.getCurrentSession();
       2: User user = new User();
       3: user.setName("ijse");
       4: Transaction ts = session.beginTransaction();
       5: try {
       6:     Criteria criteria = session.createCriteria(User.class);
       7:     criteria.add(Example.create(user));
       8:     user= (User) criteria.list().get(0);    
       9:     session.commit();
      10: } catch (HibernateException ex) {
      11:     ts.rollBack();
      12:     ex.printStackTrace();
      13: }
      14: System.out.println(user.getName());

    离线查询

    离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。

    示例:
       1: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
       2: detachedCriteria.add(Restrictions.eq("name","ijse");
       3:  
       4: Session session = SessionFactory.getCurrentSession();
       5: User user = new User();
       6: Transaction ts = session.beginTransaction();
       7: try {
       8:     Criteria criteria = detachedCriteria.getExecutableCriteria(session);
       9:     user= (User) criteria.list().get(0);    
      10:     session.commit();
      11: } catch (HibernateException ex) {
      12:     ts.rollBack();
      13:     ex.printStackTrace();
      14: }
      15: System.out.println(user.getName());

    复合查询

    复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。

    示例:
       1: Session session = SessionFactory.getCurrentSession();
       2: User user = new 
       3: User();
       4: Transaction ts = session.beginTransaction();
       5: try 
       6: {
       7:  Criteria criteria1 = 
       8: session.createCriteria(Room.class);
       9: Criteria 
      10: criteria2 =criterial1.createCriteria("User");
      11:  
      12: criteria2.add(Restrictions.eq("name",new String("ijse"));
      13:  
      14: user= (User) criteria.list().get(0); 
      15:  
      16: session.commit();
      17: } catch (HibernateException ex) {
      18:  
      19: ts.rollBack();
      20:  
      21: ex.printStackTrace();
      22: }
      23: System.out.println(user.getName());

    分页查询

    分页查询主要是要指定两个参数:从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。

    示例:

       1: Session session = SessionFactory.getCurrentSession();
       2: List userList = null;
       3: Transaction ts = session.beginTransaction();
       4: try {
       5:     Criteria criteria = session.createCriteria(User.class);
       6:     criteria.setFirstResult(0);//从第一个数据开始
       7:     criteria.setMaxResults(10);//取10条记录
       8:     userList = (List) criterial.list();   
       9:     session.commit();
      10: } catch (HibernateException ex) {
      11:     ts.rollBack();
      12:     ex.printStackTrace();
      13: }

    实践(shz)
    protected String perform() throws Exception {
            try {
                Date today = new Date();
                Date yesterday = DateUtil.addDays(today, -1);
                summerStartDate = DateUtil.getBeginSummerDate(yesterday);
                summerEndDate = DateUtil.getEndSummerDate(today);
                winterStartDate = DateUtil.getBeginWinterDate(yesterday);
                winterEndDate = DateUtil.getEndWinterDate(today);
                
                if (ShzStringUtil.isNullOrEmpty(perform)) { // 默认进入该页面时调用
                    if (searchCriteria == null) {
                        searchCriteria = new ForexAgentReportCriteria();
                    }
                    searchCriteria.setStartDate(winterStartDate);
                    searchCriteria.setEndDate(winterEndDate);
                }
                if (StringUtils.isNotEmpty(perform) && ShzConstants.PERFORM_SEARCH.equals(perform)) { // 下为查询的时候调用 

                    final DetachedCriteria detachedCriteria = DetachedCriteria.forClass(PositionTrans.class);

                    /*********** --------------------查询条件 start---------------- **************/
                    // executeTime
                    CriteriaBuilder.buildRange(
                            detachedCriteria,
                            PositionTrans.class,
                            "executeTime",
                            searchCriteria.getStartDate(),
                            searchCriteria.getEndDate());
                  
                    // tradeNo
                    if (StringUtils.isNotEmpty(searchCriteria.getTradeNo())) {
                        detachedCriteria.add(Restrictions.eq("tradeNo", searchCriteria.getTradeNo()));
                    }
                    // code
                    if (!GwStringUtil.isNullOrEmpty(searchCriteria.getCode())) {
                        detachedCriteria.add(Restrictions.eq("code", searchCriteria.getCode()));
                    }
                    
                    // platform
                    searchCriteria.setSortByFields("agentNo", "executeTime");
                    searchCriteria.setSortOrders(GwConstants.ASC, GwConstants.DESC);
                    /*********** --------------------查询条件 end---------------- **************/
                    searchService.find(searchCriteria, detachedCriteria, super.getLocale(), true);
                    
                }
            } catch (Exception e) {
                logger.error("", e);
                throw e;
            }
            return SUCCESS;
        }
  • 相关阅读:
    26 转义符 re模块 方法 random模块 collection模块的Counter方法
    25 正则表达式
    24 from 模块 import 名字
    24 from 模块 import 名字
    24 from 模块 import 名字
    23 析构方法 items系列 hash方法 eq方法
    21 isinstance issubclass 反射 _str_ _new_ _len_ _call_
    20 属性, 类方法, 静态方法. python2与python3的区别.
    python(1)
    python之字符串格式化
  • 原文地址:https://www.cnblogs.com/shz365/p/4046985.html
Copyright © 2011-2022 走看看