Criteria基本查询
(1)查询所有属性
Criteria是一个通过组装不同查询条件来获取持久对象的条件类对象,代表特定持久类的一个查询。
Criteria对SQL进行封装,让开发人员可以用对象的方式来对数据库进行操作。
//1.基本的Criteria查询,查询所有属性
public void testQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaQuery cq = session.getCriteriaBuilder().createQuery(User.class);//先创造条件构造器,通过条件对象,创建条件查询。
cq.from(User.class);
List users = session.createQuery(cq).list();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

条件查询1,查询名字含有李四的User
Criteria实际上只是个容器,如果想要设定查询条件,则要使用add()方法加入Restrictions的条件限制,
最新版函数:
//2.基本的Criteria查询,条件查询1,查询名字含有李四的User
public void testWhereQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
Predicate username = cb.equal(root.get("name"),"李四");
cq.where(username);
List users = session.createQuery(cq).getResultList();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

条件查询2,查询年龄在0~20的User
//3.基本的Criteria查询,条件查询2,查询年龄在0~20的User
public void testWhere2QueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
Predicate age1 = cb.ge(root.get("age"),0);
Predicate age2 = cb.le(root.get("age"),20);
cq.where(cb.and(age1,age2));
List users = session.createQuery(cq).getResultList();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

条件查询3,查询名字包含王的User
//4.基本的Criteria查询,条件查询3,查询名字包含王的User
public void testWhere3QueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
Predicate username = cb.like(root.get("name"), "%王%");
cq.where(username);
List users = session.createQuery(cq).getResultList();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

条件查询4,查询包含王的女性且年龄小于18的User
//5.基本的Criteria查询,条件查询4,查询包含王的女性且年龄小于18的User
public void testWhere4QueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
Predicate username = cb.like(root.get("name"), "%王%");
Predicate gender = cb.equal(root.get("gender"), "女");
Predicate age = cb.lt(root.get("age"),18);//小于
cq.where(cb.and(username,cb.and(gender,age)));
List users = session.createQuery(cq).getResultList();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

一些其他的例子
(1)查询姓名在李白和李小白之间的User
String userscope[]={“李白”,“李小白”};
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.in(“username”, userscope));
List users = criteria.list();
(2)Restrictions.allEq,参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions.eq的效果。
Criteria criteria = session.createCriteria(User.class);
Map cons = new HashMap();
cons.put(“name”,“李小白”) ;
cons.put(“password”,“123”);
criteria.add(Restrictions.allEq(cons));
List users = criteria.list();
(3)也可以使用逻辑组合来进行查询
例如结合age等于(eq)20或(or)age为空(isNull)的条件:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq(“age”, 40),
Restrictions.eq(“username“,”王二”)
));
List users = criteria.list();
(4)也可以使用逻辑组合来进行查询
例如结合age等于(eq)20或(or)age为空(isNull)的条件:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq(“age”, 40),
Restrictions.eq(“username“,”王二”)
));
List users = criteria.list();
(5)可以使用sqlRestriction()方法来提供SQL语法作限定查询
例如查询username以”大”开头的资料:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.sqlRestriction(“{alias}.username LIKE (?)”, “大%",Hibernate.STRING));//这里是指实际表中的字段名而非属性名
List users = criteria.list();
其中alias将被替换为与User类相关的名称,而?将被替换为大%,也就是第二个参数所提供的值
(6)在SQL撰写时,不必再写WHERE
如果有多个查询条件,例如BETWEEN子句的查询,则可以如下:
Criteria criteria = session.createCriteria(User.class);
Integer[] ages = {new Integer(20), new Integer(40)};
Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
criteria.add(Restrictions.sqlRestriction("{alias}.age BETWEEN (?) AND (?)", ages, types));
List users = criteria.list();
(7)Restrictions的几个常用限定查询方法如下表所示:
Criteria高级查询
使用Criteria进行查询,并使用Order对结果进行排序
//6.基本的Criteria查询,条件查询5,查询包含王的女性且年龄小于18的User,年龄由小到大
public void testWhere5QueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<User> cq = cb.createQuery(User.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
Predicate username = cb.like(root.get("name"), "%王%");
Predicate gender = cb.equal(root.get("gender"), "女");
Predicate age = cb.lt(root.get("age"),30);//小于
cq.where(cb.and(username,cb.and(gender,age)));
//cq.orderBy(cb.asc(root.get("age")));//asc:升序
cq.orderBy(cb.desc(root.get("age")));//desc:降序
List users = session.createQuery(cq).getResultList();
//查询方法一
// for(int i=0;i<users.size();i++)
// {
// User u =users.get(i);
// System.out.println(u.toString());
// }
//查询方法二
// for(User u: users)
// {
// System.out.println(u.toString());
// }
//查询方法三
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
User u=(User)iterator.next();
System.out.println(u.toString());
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}


setMaxResults()方法可以限定查询回来的记录数,setFirstResult()设定传回查询结果第一个记录的位置
这两个配合起来,就可以实现简单的分页。
例如返回第5条记录之后的10条记录(如果有的话):
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(5);
criteria.setMaxResult(10);
List users = criteria.list();
统计查询
Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能。
通过Criteria的setProjection()方法应用投影到一个查询。
您可以对查询结果进行统计动作,使用Projections的avg()、rowCount()、count()、max()、min()、countDistinct()等方法。
例如对查询结果的“age”作平均:
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg(“age”));
Number avgage = (Number)criteria.uniqueResult();
System.out.println(“平均年龄为:”+avgage);
//7.基本的Criteria查询,统计查询
public void testStatisticalQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<Number> cq = cb.createQuery(Number.class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
cq.select(cb.avg(root.get("age")));
Query query = session.createQuery(cq);
Number result = (Number)query.getSingleResult();
System.out.println(result);
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

查询两个或多个属性
//8.基本的Criteria查询,查询两个或多个属性
public void testSeveralAttributesQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
cq.multiselect(root.get("age"),root.get("gender"));
Query query = session.createQuery(cq);
List<Object[]> users = session.createQuery(cq).getResultList();
for (Object[] objects : users) {
System.out.println(Arrays.toString(objects));
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}

分组查询
//9.基本的Criteria查询,分组查询
public void testGroupQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();//使用单例模式创建Configuration对象和Session工厂
session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
ts = session.beginTransaction();//创建事务
CriteriaBuilder cb = session.getCriteriaBuilder();//创造条件构造器
CriteriaQuery<Object[]> cq = cb.createQuery(Object[].class);//通过条件对象,创建条件查询。
Root<User> root = cq.from(User.class);
//创建查询条件
cq.multiselect(root.get("gender"),cb.avg(root.get("age")));
cq.groupBy(root.get("gender"));
Query query = session.createQuery(cq);
List<Object[]> users = session.createQuery(cq).getResultList();
for (Object[] objects : users) {
System.out.println(Arrays.toString(objects));
}
ts.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
if(ts != null) {
ts.rollback();
}
}finally {
}
}
