Hibernate的三种查询方式Criteria,SQLQuery,Query
程序员文章站
2024-03-02 18:39:52
...
Hibernate提供了三种查询的方式:
hql(hibernate query language):hibernate自定义的一种查询方式,语法和sql相似。
Criteria(query by criteria):一种完全面向对象的查询方式,对pojo类操作。
SQLQuery:通过sql查询。
Criteria
Critercia由session创建:
//创建Criteria对象
Criteria criteria = session.createCriteria(User.class);
List<User> userList = criteria.list();
for (User user : userList) {
System.out.println(user.toString());
}
利用Restrictions
可以通过criteria.add(Criterion age);方法为criteria对象添加条件,其中Criterion实例可以有工具类Restrictions 创建:
//添加组合or条件
Criterion criterion = Restrictions.or(Restrictions.like("name", "%污染"), Restrictions.like("name", "调查"));
criteria.add(criterion);
//添加查某ID查询条件
criteria.add(Restrictions.idEq(2));
//查询age值大于等于13,ge是大于等于,gt是大于,eq是等于,le是小于等于
criteria.add(Restrictions.ge("age", 13));
//查询name在某集合里
criteria.add(Restrictions.in("name", new String[]{"是","调查"}));
利用Projections
通过Projections实例对查询的结果进行统计:
//统计id的行记录
criteria.setProjection(Projections.count("id"));
Object ageCount = criteria.uniqueResult();
System.out.println(ageCount.toString());
其余还有:avg(),rowCount(),countDistinct(),max(),min(),sum(),分组groupProperty()
分组后统计行数
ProjectionList projections=Projections.projectionList();
projections.add(Projections.groupProperty("age"));
projections.add(Projections.count("age"));
criteria.setProjection(projections);
List userList = criteria.list();
//遍历返回User集合
Iterator iterator=userList.iterator();
while(iterator.hasNext()){
Object[] object=(Object[]) iterator.next();
System.out.println(object[0]+":"+object[1]);
}
为Criteria对象添加排序条件,排序可以通过Order实例实现:
//添加根据id倒序排序,asc为从大到小
criteria.addOrder(Order.desc("id"));
为Criter对象设置分页
//设置从第几条记录开始
criteria.setFirstResult(1);
//设置每页的记录数
criteria.setMaxResults(10);
//执行查询
List<User> userList = criteria.list();
hql(Hibernate Query Language)
创建Query对象
//创建Query对象
Query query = session.createQuery("from User");
List<User> userList = query.list();
for (User user : userList) {
System.out.println(user.toString());
}
from User中的User为实体类,hql对实体类操作
占位符条件查询
//占位符条件查询
Query query = session.createQuery("from User where name=?");
//占位符下标从0开始,也可用setParameter,当Integer类型时用setInteger
query.setString(0, "调查");
List<User> userList = query.list();
for (User user : userList) {
System.out.println(user.toString());
}
查询某结果封装Map
//查询某结果封装Map
Query query = session.createQuery("select new map(name as username,job as userage) from User");
//占位符下标从0开始,也可用setParameter,当Integer类型时用setInteger
//query.setString(0, "调查");
List<Map<String,String>> userList = query.list();
for (Map<String, String> user : userList) {
System.out.println(user.get("username")+":"+user.get("userage"));
}
其他关键字
排序
from User Order by id desc
分组
select COUNT(user) from User user GROUP BY user.age
还有其他or,and,left join,right join 等于sql相似。
为Query对象设置分页
query.setFirstResult(1); //设置起点,默认为0
query.setMaxResults(3); //设置每页记录数
SQLQuery
SQLQuery query = session.createSQLQuery("select * from user");
//query.setEntity(0, User.class);
List objectValue =query.list(); //返回为List<Object>
for (Object object : objectValue) {
Object[] objectvalue=(Object[])object; //object强转数组类型
for (Object value : objectvalue) {
System.out.print(value+" ");
}
System.out.println();
}
实体查询
query.addEntity(User.class);
限制指定行
query.addScalar("age");
将结果转换类型
query.setResultTransformer(Transformers.aliasToBean(UserPart.class)); //UserPart中的属性与返回结果中的属性名一致,即addScalar中的实参
SQLQuery设置分页
query.setFirstResult(1);
query.setMaxResults(2);