标签:
项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来
1.初解
快速浏览了资料,大致了解了以下的内容:
1. Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是CriteriaSpecification的子接口。
2. Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样,Criteria 是在线创建,即由session创建的;DetachedCriteria 是离线的,创建时无需 Session, DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建
3. Restrictions 是工具类,它可以创建Criterion 的实例
也是囫囵吞枣的看了下,下面直接进入测试:
2.如何使用
1.查所有
/** * 作用:查所有 * 说明:通过list(),返回的是实体对象集合 */ @Test public void test1(){ //创建连接 Session session = HibernateUtil.getCurrentSession(); //开启事务 Transaction tx = session.beginTransaction(); //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务 List<User> list = criteria.list(); for (User user : list) { System.out.println(user); } //关闭事务 session.close(); }
2.条件查询
1)一个条件
/** * 作用:or()用法 * 说明:通过or()返回的是实体对象集合 * add(Criterion criterion)用来添加查询条件 * Restrictions通过内置的静态方法,可以创建criterion */ //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务:查询出id为1或为2的用户 List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1), Restrictions.eq("id", 2) )) .list();
2)多个条件
/** * 作用:多个条件:like()和gt()的用法 */ //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务:查询出id大于1,名字中带ji的用户 List<User> list = criteria.add(Restrictions.like("name","%ji%")) .add(Restrictions.gt("id", 1)) .list();
其他的条件就不一一测试了,下面列出常用的Restrictions方法
Restrictions.eq 等于 Restrictions.allEq 使用Map,使用key/value进行多个等于的比对 Restrictions.gt 大于 > Restrictions.ge 大于等于 >= Restrictions.lt 小于 < Restrictions.le 小于等于 <= Restrictions.between 对应SQL的BETWEEN子句 Restrictions.like 对应SQL的LIKE子句 Restrictions.in 对应SQL的in子句 Restrictions.and and关系 Restrictions.or or关系
3.排序
/** * 作用:排序 * 说明:通过addOrder()添加排序条件 * Order设置排序规则,desc是降序,asc是升序 */ //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务:对查询结果,根据id排序 List<User> list = criteria.addOrder(Order.desc("id")) .list();
4.关联
User实体类中有关系属性orders,
数据库中的数据如下:order表中的外键是user_id
user表:
order表:
代码如下:
/** * 作用:关联 * 说明:通过createAlias()设置关系属性 * 对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如: 这样进行查询时就可得到关联查询后的Parent对象结果集,本例中,User是Parent类 * * Hibernate打印sql语句如下: * select this_.id as id0_1_, this_.age as age0_1_, this_.birth as birth0_1_, this_.name as name0_1_, o1_.id as id1_0_, o1_.note as note1_0_, o1_.price as price1_0_ from user50 this_ inner join order50 o1_ on this_.id=o1_.user_id where o1_.id = ? * 控制台打印如下: * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26] */ @Test public void test5(){ //创建连接 Session session = HibernateUtil.getCurrentSession(); //开启事务 Transaction tx = session.beginTransaction(); //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务: List<User> list = criteria.createAlias("orders","o") .add(Restrictions.eq("o.id", 1)) .list(); for (User user : list) { System.out.println(user); } //关闭事务 session.close(); }
关联2:createCriteria()
测试代码如下
/** * 第二个createCriteria(),返回的是一个新的实例 * 打印出user和order */ @Test public void test6(){ //创建连接 Session session = HibernateUtil.getCurrentSession(); //开启事务 Transaction tx = session.beginTransaction(); //创建criteria Criteria criteria = session.createCriteria(User.class, "u"); //业务: List list = criteria.createCriteria("orders","o") .add(Restrictions.eq("o.id", 1)) .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP) .list(); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Map map = (Map)iterator.next(); // Set keySet = map.keySet(); Set entrySet = map.entrySet(); Iterator iterator2 = entrySet.iterator(); while(iterator2.hasNext()){ Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next(); System.out.println(map1.getValue()); } } //关闭事务 session.close(); }
5.Projections投影,统计行数,不重复结果
1)将结果集中的结果当做行和列集来使用,这与通过JDBC执行select查询获得的数据的使用方式相似。因此,Hibernate也支持属性、统计函数和Group By等查询。
2)要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象
3)Hibernate的Projections工厂类包含了以下几个常用的统计函数:
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
代码如下:
/** * 投影:Projections * 统计,重复 */ @Test public void test8(){ //创建连接 Session session = HibernateUtil.getCurrentSession(); //开启事务 Transaction tx = session.beginTransaction(); //创建criteria Criteria criteria = session.createCriteria(Order.class, "o"); //业务: List<Object[]> list = criteria.setProjection(Projections.projectionList() .add(Projections.max("price")) .add(Projections.min("price")) .add(Projections.avg("price")) .add(Projections.countDistinct("note")) ) .list(); for (Object[] objects : list) { for (Object object : objects) { System.out.println(object); } } //关闭事务 session.close();
获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中
/** * 投影:Projections * 获取部分字段 */ @Test public void test9(){ //创建连接 Session session = HibernateUtil.getCurrentSession(); //开启事务 Transaction tx = session.beginTransaction(); //创建criteria Criteria criteria = session.createCriteria(Order.class, "o"); //业务: ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("name")); projList.add(Projections.property("price")); criteria.setProjection(projList); List result = criteria.list(); for (Object object : result) { System.out.println(object); } //关闭事务 session.close(); }
就先记录到这里,手抖中~~~~~~
标签:
原文地址:http://www.cnblogs.com/liuconglin/p/5721863.html