概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。
1.标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation)
2.Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性。Hibernate官方推荐使用HQL进行查询。
3.Native SQL Queries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。
下面通过一个使用HQL语句并且使用Map集合传参的例子来体会:
/**
* 根据hql查询某个对象
* @param hql 查询语句
* @param params 查询条件
* @return
*/
public static <T> T getByHql(String hql,Map<String, Object> params){
/*创建Query对象【HibernateUtils为自定义的工具类】*/
Query query = HibernateUtils.getSession().createQuery(hql);
/*如果参数不为空*/
if (params != null && !params.isEmpty()){
/*遍历设置参数*/
for (String key : params.keySet()){
query.setParameter(key, params.get(key));
}
}
/*获取查询结果的集合*/
List<T> list = query.list();
if (list != null && list.size() > 0){
/*如果集合中有值的话,返回集合的第一个值,作为当前查询结果的对象返回*/
return list.get(0);
}
/*如果没有值的话返回空*/
return null;
}
测试方法:
public static void findByHql(){
/*查询语句*/
String hql = "from User where uname =:name";
/*存储查询参数的集合*/
Map<String, Object> params = new HashMap<String, Object>();
/*添加参数*/
params.put("name", "李克强");
/*查询出一个User对象*/
User user = HibernateUtils.getByHql(hql, params);
System.out.println(user.getUname());
}
使用Hql实现分页,原理代码如下:
/*查询语句*/
String hql = "from XXX";
/*创建Query对象*/
Query query = session.createQuery(sql);
/*设置从哪一条开始取数据*/
query.setFirstResult(20);
/*设置每页显示多少条数据*/
query.setMaxResults(10);
注:setFirstResult(XXX)表示设置从哪一条开始取数据,加入传入的参数为当前页page,那么应该是这样的:query.setFirstResult((page-1)*每页显示的数量);
分页工具类方法:
/**
* 根据hql按条件查询并分页
* @param hql 查询语句
* @param params 查询参数
* @param page 当前页
* @param rows 每页显示多少条数据
* @return 返回List集合
*/
public static <T> List<T> findByHql(String hql,Map<String, Object> params,int page,int rows){
/*创建Query对象*/
Query query = HibernateUtils.getSession().createQuery(hql);
/*如果参数不为空*/
if (params != null && !params.isEmpty()){
/*遍历集合,设置参数*/
for (String key : params.keySet()){
query.setParameter(key, params.get(key));
}
}
/*设置从第几条开始取数据*/
query.setFirstResult((page-1)*rows);
/*设置每页显示都少条数据*/
query.setMaxResults(rows);
/*返回查询的结果集*/
return query.list();
}
测试类:
/**
* 分页测试
*/
public static void findScrollByHql(){
/*查询语句*/
String hql = "from User where uname =:name";
/*存储查询参数的集合*/
Map<String, Object> params = new HashMap<String, Object>();
/*添加参数*/
params.put("name", "李克强");
/*查询出第二页,每页显示3条数据*/
List<User> users = HibernateUtils.findByHql(hql, params, 2, 3);
System.out.println(users.size());
}
Criteria接口实现数据查询:
/**
* 通过标准查询接口查询
* @param name 查询参数
* @return
*/
public static List<User> findByCriteria(String name){
/*创建Session*/
Session session = HibernateUtils.getSession();
/*创建Criteria查询对象*/
Criteria cri = session.createCriteria(User.class);
/*添加查询条件1*/
cri.add(Restrictions.eq("uname", name));
/*添加查询条件2*/
//cri.add(Restrictions.eq("usex", "男"));
List<User> users = cri.list();
return users;
}
添加条件:cri.add(Restrictions.eq("uname", name));eq表示等于即查询uname字段为name的结果,另外还有其他的一些常用的运算符,如下:
/*查询uname为name的值*/
cri.add(Restrictions.eq("uname", name));
/*查询模糊查询的值*/
cri.add(Restrictions.like("uname", name));
/*查询年龄小于20的值*/
cri.add(Restrictions.lt("age", 20));
/*查询年龄大于20的值*/
cri.add(Restrictions.gt("age", 20));
/*查询年龄大于等于20的值*/
cri.add(Restrictions.ge("age", 20));
/*查询年龄小于等于的值*/
cri.add(Restrictions.le("age", 20));
/*查询uname为空的值*/
cri.add(Restrictions.isNull("uname"));
/*查询uname不为空的值*/
cri.add(Restrictions.isNotNull("uname"));