用到特定于数据库的SQL 语句,程序本身会依赖于特定的数据库
不了解SQL 语句,恐怕对使用HQL带来困难
Hibernate提供的Criteria查询
帮助我们解决了这种问题
Criteria 查询采用面向对象方式封装查询条件,又称为对象查询
对SQL
语句进行封装
采用对象的方式来组合各种查询条件
由Hibernate 自动产生SQL 查询语句
Criteria由Hibernate
Session进行创建
SessionFactory
sessionFactory
=
new Configuration().configure()
.buildSessionFactory();
Session
session
=
sessionFactory.openSession();
Criteria
criteria
=
session.createCriteria(User.class);
//查询该实体中所有数据
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();
--------------------------------------------------------------
Criteria
criteria
=
session.createCriteria(User.class);
criteria.add(Restrictions.eq("name",
"bob")); //使用add()添加查询条件
//查询条件:name='admin'
List
result
= criteria.list();
Iterator
it
= result.iterator();
//...
方法 |
说 明 |
Restrictions.eq() |
对应SQL的等于(’=’) |
Restrictions.allEq() |
使用Map,使用key/value进行多个相等的值的比对 |
Restrictions.gt() |
对应SQL的大于 (‘>’) |
Restrictions.ge() |
对应SQL的大于等于 (‘>=’) |
Restrictions.lt() |
对应SQL的小于 (‘<’) |
Restrictions.le() |
对应SQL的小于等于 (‘<=’) |
Restrictions.between() |
对应SQL的between子句 |
Restrictions.like() |
对应SQL的like子句 |
Restrictions.in() |
对应SQL的in子句 |
Restrictions.and() |
对应SQL的and |
Restrictions.or() |
对应SQL的or |
Restrictions.not() |
对应SQL的not |
Criteria
criteria
=
session.createCriteria(House.class);
criteria.add(Restrictions.or(
Restrictions.eq("price",
new Double(2300)),
Restrictions.like("title",
"%地铁%")));
如果属性条件很多,使用Restrictions
也不方便
Hibernate提供Example
的create()方法来建立Example 实例,Example 实现了Criteria 接口
House
house
=
new House();
house.setPrice(new
Double(2000));
//查询条件,添加到house对象中
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));
//通过Example
的create()方法来建立Example
实例作为查询条件
Hibernate
在自动生成SQL
语句时将自动过滤掉对象的空属性,根据有非空属性值的属性生成查询条件
Criteria
查询不仅能组合出SQL中where子句的功能,还可以组合出排序查询功能
使用org.hibernate.criterion.Order对结果进行排序
排序的方法为:
asc()
desc()
Criteria
criteria
=
session.createCriteria(House.class);
criteria.addOrder(Order.desc("price"));
//加入Order
条件
以价格降序的方式排列
Criteria
的setMaxResults()方法可以限定查询返回数据的行数
Criteria
的setFirstResult()设定查询返回结果的第一行数据的位置
结合以上Criteria的两个方法即可实现简单分页
Criteria
criteria
=
session.createCriteria(House.class);
criteria.setFirstResult(3);
//设定查询返回结果的第一行数据的位置
//从第4条数据开始读
criteria.setMaxResults(2);
//限定查询返回数据的行数
//取2条
List
results = criteria.list();
总结
如何使用Criteria
查询?
如何使用Example查询已有实体对象的类似对象?
如何使用Order对Criteria查询结果进行排序?
如何使用Criteria限定查询返回的数据行数?
补充:
Example不能以主键字段查询,-->
全返回数据
也不会使用like查询
(eq.()方法)