最近在做SSH项目,用到了Hibernate的查询方式,自己总结了一下
1.HQL查询方式
灵活直观,和SQL查询相差不大,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
例子:Session session = SessionFactory.getCurrentSession();
User user = null;
Transaction ts = session.beginTransaction();
try{
Query query = session.createQuery("from User as u where name = 'lee'");
user = (User)query.list().get(0);
session.commit();
}catch(){
ts.rollBack();
}
2.QBC的查询方式(Query By Criteria)
面向对象的方式,重点有三个对象Restrictions,Order,Projections,一般步骤
使用Session实例的createCriteria()方法创建Criteria对象,使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。使用Criteria对象的list()方法进行查询并返回结果
1)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
2)Order类的常用方法:
方法名称 描述
Order.asc 升序
Order.desc 降序
3)Projections类的常用方法
方法名称 描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计
例子:
Session session = SessionFactory.getCurrentSession();
User user = null;
Transaction ts = session.beginTransaction();
try{
Criteria criteria = session.createCtiteria(User.class);
criteria.add(Restriction.eq("name","lee"));
user = (User)criteria.list().get(0);
session.commit();
}catch(){
ts.rollBack();
}
3.离线查询离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好
// 使用离线条件查询.
DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
// 查询热门的商品,条件就是is_host = 1
criteria.add(Restrictions.eq("is_hot", 1));
// 倒序排序输出:
criteria.addOrder(Order.desc("pdate"));
// 执行查询:
List<Product> list = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);
分页查询主要指定两个参数,从第几条数据开始,取多少条数据。可以通过调用Query或者Criteria对象的setFirstResult()和setMaxResults()方法分别进行设定。
例子:Session session =SessionFactory.getCurrentSession();
List userList = null;
Transaction ts = session.beginTransaction();
try {
Criteria criteria =session.createCriteria(User.class);
criteria.setFirstResult(0);//从第一个数据开始
criteria.setMaxResults(10);//取10条记录
userList = (List)criterial.list();
session.commit();
} catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
或者 List<Product> list = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);