WUJUNWEI'S BLOG
WuJunwei
Jul 20, 2020
It takes 13 minutes to read this article.

Criteria查询介绍;使用;查询排序;分页

Criteria查询介绍

问题

用到特定于数据库的SQL 语句,程序本身会依赖于特定的数据库

不了解SQL 语句,恐怕对使用HQL带来困难

Hibernate提供的Criteria查询帮助我们解决了这种问题

特点

  • Criteria 查询采用面向对象方式封装查询条件,又称为对象查询
  • 对SQL 语句进行封装
  • 采用对象的方式来组合各种查询条件
  • 由Hibernate 自动产生SQL 查询语句
  • Criteria由Hibernate Session进行创建

使用

简单查询

SessionFactory sessionFactory = new Configuration().configure()
	        .buildSessionFactory();
	Session session = sessionFactory.openSession();
	//创建Criteria对象
	Criteria criteria = session.createCriteria(User.class);
	//使用Criteria 的list()方法获得数据,list()方法返回List 实例
	List result = criteria.list();
	Iterator it = result.iterator();
	while (it.hasNext()) {
		User user = (User) it.next();
		System.out.println("用户名:" + user.getName());
	}
	session.close();
	sessionFactory.close();

按照条件查询

 SessionFactory sessionFactory = 
            new Configuration().configure() .buildSessionFactory();
    Session session = sessionFactory.openSession();
    Criteria criteria = session.createCriteria(User.class);
	//使用add()添加查询条件
	//查询条件:name='admin'
	//返回条件实例
    criteria.add(Restrictions.eq("name", "bob"));
    List result = criteria.list();
    Iterator it = result.iterator();
    while (it.hasNext()) {
        User user = (User) it.next();
        System.out.println("用户名:" + user.getName());
    }
    session.close();
    sessionFactory.close();

Restrictions常用限定查询方法

使用Restrictions

如果属性条件很多,使用Restrictions 也不方便

SessionFactory sessionFactory = 
        new Configuration().configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    Criteria criteria = session.createCriteria(House.class);
    criteria.add(Restrictions.or(
            Restrictions.eq("price", new Double(2300)),
            Restrictions.like("title", "%地铁%")));
    List result = criteria.list();
    Iterator it = result.iterator();
    while (it.hasNext()) {
        House house = (House) it.next();
        System.out.println("标题:" + house.getTitle());
    }
    session.close();
    sessionFactory.close();

使用Example

Hibernate提供Example 的create()方法来建立Example 实例,Example 实现了Criteria 接口

Hibernate 在自动生成SQL 语句时将自动过滤掉对象的空属性,根据有非空属性值的属性生成查询条件

House house = new House();
house.setPrice(new Double(2000));
house.setFloorage(new Integer(40));
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(House.class);
criteria.add(Example.create(house));
List results = criteria.list();
Iterator it = results.iterator();
while(it.hasNext()){
    House h= (House)it.next();
    System.out.println("标题:"+h.getTitle()+"  价格"+h.getPrice());
}
session.close();
sessionFactory.close();

Criteria查询排序

Criteria 查询不仅能组合出SQL中where子句的功能,还可以组合出排序查询功能 使用org.hibernate.criterion.Order对结果进行排序

排序的方法为:

  • asc()
  • desc()

    SessionFactory sessionFactory = new Configuration().configure() .buildSessionFactory(); Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(House.class); //加入Order 条件并以价格降序的方式排列 criteria.addOrder(Order.desc(“price”)); List result = criteria.list(); Iterator it = result.iterator(); while (it.hasNext()) { House house = (House) it.next(); System.out.println(“标题:” + house.getTitle() + “ 价格” + house.getPrice()); } session.close(); sessionFactory.close();

Criteria查询实现分页

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(House.class);
criteria.setFirstResult(3);
criteria.setMaxResults(2);
List results = criteria.list();
Iterator it = results.iterator();
while(it.hasNext()){
	House h = (House)it.next();
	System.out.println("标题:"+h.getTitle()+ "  价格:"+h.getPrice());			
}
session.close(); 
sessionFactory.close();

Hibernate: select * from ( select row_.*, rownum rownum_ from ( select this_.id as id4_3_, 
this_.user_id as user2_4_3_, this_.type_id as type3_4_3_, this_.street_id as street4_4_3_, 
this_.title as title4_3_, this_.price as price4_3_, this_.pubdate as pubdate4_3_, this_.floorage as
 floorage4_3_, this_.contact as contact4_3_, user2_.id as id0_0_, user2_.name as name0_0_, 
user2_.password as password0_0_, user2_.telephone as telephone0_0_, user2_.username as 
username0_0_, user2_.isadmin as isadmin0_0_, type3_.id as id3_1_, type3_.type_name as type2_3_1_, 
street4_.id as id2_2_, street4_.street_name as street2_2_2_, street4_.district_id as district3_2_2_
 from jbit.house this_ inner join jbit.users user2_ on this_.user_id=user2_.id inner join housetype 
type3_ on this_.type_id=type3_.id inner join street street4_ on this_.street_id=street4_.id ) row_ 
where rownum <= ?) where rownum_ > ?

使用Criteria进行分页查询

实现思路:

  • 创建HibernateUtil类
  • 创建DAO 类
    • 使用Restrictions.like()完成SQL中like 子句的功能
    • 使用Restrictions.between()完成SQL中between关键字的功能
    • criteria.setFirstResult((pageIndex-1) * 5);
    • criteria.setMaxResults(5);
    • criteria.addOrder(Order.desc(“price”));
  • 创建业务类
  • 创建测试类,在main方法中获取控制台输入数据,调用相应的业务类,获得数据