• Hibernate Criteria查询


    虽然可以自己写Sql,但在程序中需要动态生成Sql语句时,where子句中条件是动态产生时,使用Criteria是再好不过的选择。

    先看例子: 

            Criteria criteria=session.createCriteria(Product.class);
            Criterion criterion1=Restrictions.between("id", 10, 15); //Criterion接口
         	criteria.add(criterion1);
            List<Product> list=criteria.list(); 
    	for(Product p:list){
    	     System.out.println(p.getId()+" "+p.getName());
    	}
    

    输出:

    Hibernate: 
        select
            this_.ID as ID4_0_,
            this_.NAME as NAME4_0_,
            this_.PRICE as PRICE4_0_,
            this_.DESCRIPTION as DESCRIPT4_4_0_ 
        from
            hib.product this_ 
        where
            this_.ID between ? and ?
    10 台灯3
    11 台灯2
    15 台灯
    

    可以使用方法链,因为add()后仍返回当前Criteria对象。如下

    List<Product> list=session.createCriteria(Product.class).add(Restrictions.between("id",10,15)).list();  

    1.排序 criteria.addOrder(Order.desc("id"));

    2.分页

    criteria.setMaxResults(3);
    criteria.setFirstResult(3);

    mysql产生如下语句:

    Hibernate: 
        select
            this_.ID as ID4_0_,
            this_.NAME as NAME4_0_,
            this_.PRICE as PRICE4_0_,
            this_.DESCRIPTION as DESCRIPT4_4_0_ 
        from
            hib.product this_ limit ?,
            ?
    

    oracle则产生:

    select * from(
          select row_.*,rownum rownum_
          from(
               原始sql语句
          ) row_
         where rownum<=?
    )
    where rownum_>?
    
     
    

    3.单条记录

    criteria.setMaxResults(1);
    Product p=(Product)criteria.uniqueResult();
    

     4.在关联对象上增加条件

    Criteria criteria=session.createCriteria(Product.class);
    criteria.createCriteria("category").add(Restrictions.between("id",35, 40));
    //Product和Category是多对一的关系
    //Prodcut类中成员 Category category;
    		
    

     输出:

        select
            this_.ID as ID4_1_,
            this_.CATEGORY_ID as CATEGORY2_4_1_,
            this_.NAME as NAME4_1_,
            this_.PRICE as PRICE4_1_,
            this_.DESCRIPTION as DESCRIPT5_4_1_,
            category1_.ID as ID3_0_,
            category1_.NAME as NAME3_0_,
            category1_.DESCRIPTION as DESCRIPT3_3_0_ 
        from
            hib.pro this_ 
        inner join
            hib.category category1_ 
                on this_.CATEGORY_ID=category1_.ID 
        where
            category1_.ID between ? and ?
    

     使用内连接查询。如果是一的一方中增加对多的一方的条件,则结果是类似的。

    Criteria criteria=session.createCriteria(Category.class);
    criteria.createCriteria("products").add(Restrictions.between("id",1,2));
    criteria.list();
    

    输出:

    Hibernate: 
        select
            this_.ID as ID3_1_,
            this_.NAME as NAME3_1_,
            this_.DESCRIPTION as DESCRIPT3_3_1_,
            product1_.ID as ID4_0_,
            product1_.CATEGORY_ID as CATEGORY2_4_0_,
            product1_.NAME as NAME4_0_,
            product1_.PRICE as PRICE4_0_,
            product1_.DESCRIPTION as DESCRIPT5_4_0_ 
        from
            hib.category this_ 
        inner join
            hib.pro product1_ 
                on this_.ID=product1_.CATEGORY_ID 
        where
            product1_.ID between ? and ?
    

    5.统计函数查询

    criteria.setProjection(Projections.max("price"));
    Float f=(Float)criteria.uniqueResult();
    System.out.println(f);

    6.多个统计值

    	Criteria criteria=session.createCriteria(Product.class);
            ProjectionList proList=Projections.projectionList();
            proList.add(Projections.max("price"));
            proList.add(Projections.min("price"));
    	criteria.setProjection(proList);
            Object[] values=(Object[])criteria.uniqueResult();
    

    7.分组统计

    	Criteria criteria=session.createCriteria(Product.class);
            ProjectionList proList=Projections.projectionList();
            proList.add(Projections.max("price"));
            proList.add(Projections.min("price"));
            proList.add(Projections.rowCount());
            proList.add(Projections.groupProperty("category"));//注意这里都是指POJO类的属性名,而不是数据库列名
    	criteria.setProjection(proList);
            List<Object[]> values=criteria.list();
    

    8.使用别名,

      proList.add(
           Projections.alias(
                    Projections.max("price"),"maxp")	//别名的好处是下文可以用别名来限定条件
      );
    

    或者:  proList.add( Projections.max("price").as("maxp"));
    9.投影查询,限定列

            ProjectionList proList=Projections.projectionList();
            proList.add(Property.forName("price"));
            proList.add(Property.forName("id"));
    	criteria.setProjection(proList);
    

    10.使用org.hibernate.criterion.Property.forName()方法实现分组统计
    proList.add(Property.forName("price").max()); 
    proList.add(Property.forName("category").group().as("c"));

     11.使用DetachedCriteria(不与Session对象绑定,独立)

                   //表现层,保存用户的动态查询条件
    		DetachedCriteria dc=DetachedCriteria.forClass(Product.class);
    		dc.add(Restrictions.between("id", 1, 5))
    			.add(Restrictions.like("name", "台"));
    		dc.addOrder(Order.desc("id"));
    		//业务逻辑层与当前Session绑定
    		//获取,开启session
    		Criteria criteria=dc.getExecutableCriteria(session);
    		List values=criteria.list();
    

    12.根据示例对象查询(QBE)

    		Product p1=new Product();
    		p1.setName("台");
            	Criteria criteria=session.createCriteria(Product.class);
    		criteria.add(Example.create(p1));
    		List values=criteria.list();
    

      

      

     

      

     

     

  • 相关阅读:
    Git远程库
    Git的使用
    如何利用IO流复制文件
    Lambda表达式
    Lambda表达式的标准格式
    线程池的使用步骤
    解决线程安全的三个方法
    多线程
    位运算
    如何用javadoc生成java帮助文档
  • 原文地址:https://www.cnblogs.com/tazi/p/2287110.html
Copyright © 2020-2023  润新知