Session session = null;
try {
session = HibernateSessionFactory.getSession();
session.beginTransaction();
//当session.createCriteria(实体类.class) 就会产生一条select所有列from 表SQL语句,
//查询实体类对应数据表的所有记录,然后我们就可以在这个Criteria对象上进行条件查询、
//分页查询、多表关联查询、投影查询、子查询等一系列操作
Criteria criteria = session.createCriteria(User.class);
List<User> results = criteria.list();
System.out.println(results.size());
//对查询添加条件对象Criterion
criteria = session.createCriteria(User.class);
criteria.add(Restrictions.like("userName", "jaeson%"));
results = criteria.list();
System.out.println(results.size());
//AND或OR使用LogicalExpression限制条件
criteria = session.createCriteria(User.class);
Criterion zipCode = Restrictions.gt("address.zipCode", 2000);
Criterion userName = Restrictions.like("userName","jaeson%");
//对于多个查询条件,Restrictions提供了逻辑组合查询方法
//and(Criterion lhs, Criterion rhs) 用于生成多个条件and关系SQL语句;
//or(Criterion lhs, Criterion rhs) 用于生成多个条件or关系SQL语句;
LogicalExpression orExp = Restrictions.or(zipCode, userName);
criteria.add( orExp );
//分页操作 firstResult和maxResults
criteria.setFirstResult(0);
criteria.setMaxResults(10);
//排序操作 Order
criteria.addOrder(Order.desc("userName"));
criteria.addOrder(Order.asc("id"));
results = criteria.list();
System.out.println(results.size());
//多表关联操作 createAlias和createCriteria
//Criteria接口提供createAlias 和 createCriteria 两组方法用于完成多表关联查询。
//createAlias(String associationPath, String alias) 采用内连接关联。
//createAlias(String associationPath, String alias, int joinType) 可以通过joinType指定连接类型。
//createCriteria(String associationPath) 采用内连接关联(返回新的Criteria对象)。
//createCriteria(String associationPath, int joinType) 可以通过joinType指定关联类型(返回新的Criteria对象 )。
//方法一:使用createCriteria方法
criteria = session.createCriteria(User.class);
//通过User类的department属性返回新的Criteria
Criteria criteria2 = criteria.createCriteria("department");
criteria2.add(Restrictions.eq("deptName", "行政部"));
results = criteria.list();
System.out.println(results.size());
//方法二:使用createAlias 方法
//使用createAlias方法不会像createCriteria那样返回一个新的Criteria对象,alias只是对关联表进行别名设置,通过别名引用设置属性。
criteria = session.createCriteria(User.class);
//进行表关联,设置User类的属性department的别名
criteria.createAlias("department", "d");
criteria.add(Restrictions.eq("d.deptName", "行政部"));
results = criteria.list();
System.out.println(results.size());
//投影、分组查询 Projection
//在实际开发中,进行查询是:可能只需要返回表中的指定列信息(投影)或者进行统计查询(count、avg、sum、min、max),
//Criteria接口提供setProjection(Projection projection)方法用于实现投影查询操作。
//org.hibernate.criterion.Projections工厂类用于返回Projection投影查询对象。
criteria = session.createCriteria(User.class);
//通过Projections.property指定查询哪些属性
criteria.setProjection(Projections.projectionList()
.add(Projections.property("id"))
.add(Projections.property("userName")));
List<Object []> list = criteria.list();
System.out.println(((Object []) list.get(0))[1]);
//Projections提供了分组函数的查询方法:
//rowCount() 查询记录总数量;
//count(String propertyName) 统计某列数量;
//countDistinct(String propertyName) 统计某列数量(排除重复);
//avg(String propertyName) 统计某列平均值;
//sum(String propertyName) 对某列值求和;
//max(String propertyName) 求某列最大值;
//min(String propertyName) 求某列最小值。
criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.rowCount());
Long count = (Long) criteria.uniqueResult();
System.out.println(count);
criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("department"))
.add(Projections.count("id")));
List<Object []> listGourp = criteria.list();
Object [] countarr = (Object []) listGourp.get(0);
System.out.println(countarr[1] + "=" + ((Department) countarr[0]).getDeptName());
session.getTransaction().commit();
} catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateSessionFactory.closeSession();
}
* Criteria:
* org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Criterion接口的一个实例,
用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions 工厂类完成的。
org.hibernate.criterion.Order用于排序操作, Criteria 接口提供addOrder(Order order)用于生成排序SQL。
* Restrictions 运算符 含义:
= Restrictions.eq() 等于
<> Restrictions.not(Exprission.eq()) 不等于
> Restrictions.gt() 大于
>= Restrictions.ge() 大于等于
< Restrictions.lt() 小于
<= Restrictions.le() 小于等于
is null Restrictions.isnull() 等于空值
is not null Restrictions.isNotNull() 非空值
like Restrictions.like() 字符串模式匹配
and Restrictions.and() 逻辑与
and Restrictions.conjunction() 逻辑与
or Restrictions.or() 逻辑或
or Restrictions.disjunction() 逻辑或
not Restrictions.not() 逻辑非
in(列表) Restrictions.in() 等于列表中的某一个值