问题九、Hibernate里面如何用Criteria 查询记录数

【问题描述】在工作中,有一个比较复杂的feature使用的是hibernate的Criteria实现的查询,但是PM要求在查询数据前,先告知用户有多少条数据,让用户去选择返回多少条记录。
【解决办法】使用Projections.count("property") 或者 Projections.rowCount()

Criteria c = session.createCriteria(User.class);
c.setProjection(Projections.rowCount());
int rows=Integer.parseInt(c.uniqueResult().toString());
s.setProjection(null)  

参考:http://blog.csdn.net/virgoboy...

问题十、Hibernate Criteria Join with 3 Tables

Criteria c = session.createCriteria(Dokument.class, "dokument");
c.createAlias("dokument.role", "role"); // inner join by default
c.createAlias("role.contact", "contact");
c.add(Restrictions.eq("contact.lastName", "Test"));
return c.list();

或者这样:

Criteria c = session.createCriteria(Dokument.class);
c.createAlias("role", "role"); // inner join by default
c.createAlias("role.contact", "contact");
c.add(Restrictions.eq("contact.lastName", "Test"));
return c.list();

如果实体对象中含有OneToMany关联对象的情况,既是实体中含有list或Set等关联实体集合的情况下怎么办呢?
这个还不知道怎么办,呵呵
方法其实是非常简单的:

dc.createAlias("tags", "t");
dc.add(Restrictions.eq("t.id", tagId));  

其中tags是个Set,但是想查找属性tags中含有id为tagId的实体,使用上面的就可以了。

这里有一个特殊情况,如果是对引用对象的id查询,则可以不用建立引用,也就是可以不调用createAlias()语句,如下所示:

DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));

据我个人的经验,team后只能跟其主键属性,比较其他属性要用别名。

参考:http://stackoverflow.com/ques...
http://www.cnblogs.com/newpan...

问题十一、DetachedCriteria、Criteria 使用区别

在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。
此时,我们不能在Web层使用Criteria,因为它是和Session绑定的。
DetachedCriteria可以解决这个问题,即在web层,程序员使用DetachedCriteria来构造查询条件,然后将这个 DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后,可以在session范围内直接构造Criteria,进行查询。就此,查询语句的构造完全被搬离到web层实现,而业务层则只负责完成持久化和查询的封装即可,与查询条件构造完全解耦,非常完美!

Criteria 和 DetachedCriteria 的主要区别
在于创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的,而 DetachedCriteria 是离线的,创建时无需Session .
DetachedCriteria的创建

DetachedCriteria 提供了 2 个静态方法 ,进行DetachedCriteria 实例的创建。
forClass(Class)
forEntityName(Name)

Spring 的框架提供了对于离线查询的支持,非常的简单的使用那些方法
Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结果。Criteria的子类就是 DetachedCriteria 我们可以简单的使用就好了。
使用到了这些我们就不得不说 Restrictions 是产生查询条件的工具类。
当然你也可以手动这么干:

DetachedCriteria query = DetachedCriteria.forClass(Cat.class).add( Property.forName("sex").eq('F') );
//创建一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();

切记,DetachedCriteria实例不要去重用它

DetachedCriteria作为子查询

//主查询:人员查询
DetachedCriteria searDc =
DetachedCriteria.forClass(QymlPerson.class);//子查询:职务人员关系表
DetachedCriteria sub =
DetachedCriteria.forClass(QymlPositionUserLink.class);
sub.add(Restrictions.eq("positionunid", positionunid));
//子查询:指定查询的列(也就是select usernuid from ....)
sub.setProjection(Property.forName("userunid"));//主查询和子查询关联(也就是where unid in (select userunid from...) )
searDc.add(Property.forName("unid").in(sub));

在上面的例子中,用个一个类似于下面SQL 的子查询

Select * from Person a where a.unid in (select userunid from PositionUserLink b where
b.positionunid = ..)

Property 还有其他的条件判断,参考api
http://docs.jboss.org/hiberna...
ion/Property.html。

动态关联抓取

我们的抓取模式,对于1对多的关联的形式!是不是抓取过来呢?
你可以使用setFetchMode()在运行时定义动态关联抓取的语义

List cats = sess.createCriteria(Cat.class).add( Restrictions.like("name", "Fritz%") ).setFetchMode("mate", FetchMode.JOIN).setFetchMode("kittens", FetchMode.JOIN).list();

这个查询可以通过外连接抓取mate和kittens。

参考:http://blog.csdn.net/u0128819...
http://blog.sina.com.cn/s/blo...

问题十二、投影(Projections)、聚合(aggregation)和分组(grouping)

org.hibernate.criterion.ProjectionsProjection 的实例工厂。
我们通过调用setProjection()应用投影到一个查询。这个的意思就是查询哪一列的意思
用来进行聚合操作,和sql中的聚合类似.求和/求平均值/统计记录数/…等等.
还有用来获取获取对象的某些属性(表字段)或属性集合.正常情况下,查询返回的是对象或对象的集合.使用投影的话就可以只返回你需要的属性值.此时,即Hibernate不把记录封装对象了,只返回你在投影中设置的属性的值(值的集合)的数组

List results = session.createCriteria(Cat.class).setProjection( Projections.projectionList().add( Projections.rowCount() )//当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:如//.add( Projections.rowCount() ,"count").add( Projections.avg("weight") ).add( Projections.max("weight") ).add( Projections.groupProperty("color") )).list();

可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式:

List results = session.createCriteria(Cat.class).setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )//.setProjection( Projections.groupProperty("color").as("colr") ).addOrder( Order.asc("colr") ).list();

也可以使用Property.forName()来表示投影:

List results = session.createCriteria(Cat.class).setProjection( Projections.projectionList().add( Projections.rowCount().as("catCountByColor") ).add( Property.forName("name")).add( Property.forName("weight").avg().as("avgWeight") ).add( Property.forName("weight").max().as("maxWeight") ).add( Property.forName("color").group().as("color" )).addOrder( Order.desc("catCountByColor") ).addOrder( Order.desc("avgWeight") ).list();

参考:http://blog.csdn.net/u0128819...

Hibernate之DetachedCriteria、Criteria相关推荐

  1. Hibernate的DetachedCriteria使用(含Criteria)

    1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种,这里做简单的概念介绍,不详细进行展开. 1.1 HQL(Hibernate Qu ...

  2. Hibernate的DetachedCriteria使用(含Criteria)转载

    https://www.cnblogs.com/deng-cc/p/6428599.html 1.背景了解:Hibernate的三种查询方式 Hibernate总的来说共有三种查询方式:HQL.QBC ...

  3. Hibernate查询之Criteria查询

    转自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一种比hql更面向对象的查询方式.Criteria ...

  4. Hibernate之DetachedCriteria类详解

    首先看DetachedCriteria这个类名,是由两个单词(detached和criteria)组成的,Criteria咱们知道是QBC查询主要接口之一,它通过组装各种Criterion对象来获取实 ...

  5. Hibernate中使用Criteria查询及注解——(DeptTest.java)

    DeptTest.java 测试类: 先创建Session: private Session session;private Transaction tx;@Beforepublic void bef ...

  6. Hibernate中使用Criteria查询及注解——(Emp.hbm.xml)

    Emp.hbm.xml 员工信息表的映射文件 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ...

  7. Hibernate中使用Criteria查询及注解——( EmpCondition)

    EmpCondition: 动态查询的条件类: package cn.bdqn.hibernate_Criteria.entity;import java.util.Date;/*** Criteri ...

  8. Hibernate中使用Criteria查询及注解——(HibernateUtil)

    HibernateUtil hibernate工具类: package cn.bdqn.hibernate_Criteria.Util;import org.hibernate.Session; im ...

  9. Hibernate中使用Criteria查询及注解——(hibernate.cfg.xml)

    hibernate.cfg.xml hibernate主配置文件: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernat ...

  10. Hibernate中使用Criteria查询及注解——(Dept.hbm.xml)

    Dept.hbm.xml 部门表的映射文件: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ...

最新文章

  1. Activity应用场景解析
  2. Abp mysql guid_.NET生成多数据库有序Guid
  3. acm算法模板(2)
  4. 智能硬件的时代,嵌入式是否已经日薄西山
  5. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...
  6. OpenGL入门-1
  7. Java创建对象小结
  8. [C++]头文件(Header Files)和命名空间(Namespace)
  9. 千兆网线的制作方法和千兆网线的施工注意事项
  10. 嵌入式、单片机和PLC哪个前景好一些?
  11. php 加权计算公式,PHP计算加权平均数的方法
  12. Linux DMA Engine framework(2)_功能介绍及解接口分析
  13. 给你一本武林秘籍,和KeeWiDB一起登顶高性能
  14. YOLO V6系列(一) -- 跑通YOLO V6算法
  15. 王峰十问Nervos联合创始人王宁宁:缘何“中国最懂以太坊的人”要走中国公链的自主创新之路?...
  16. Windows 8寄托着微软对移动计算、客厅控制和超级操作系统的全新理解与尝试
  17. 红旗颂的感情多么真挚,突然很理解老一代们:-)
  18. 使用linux配置环境变量后发现命令不能用问题
  19. presto安装问题
  20. 推挽电路原理“上P下N”及“上N下P”的区别

热门文章

  1. .Net软件设计新思维
  2. 「06」回归的诱惑:一文读懂线性回归(Python实战篇)
  3. 海量数据挖掘MMDS week4: 推荐系统之隐语义模型latent semantic analysis
  4. 【数据结构笔记】归并排序(merge_sort)+ 堆排序 -- python2.7
  5. android nexus 6尺寸,谷歌Nexus 6详细配置曝光 原生Android大杀器
  6. c语言如何在手机上运行程序,各位前辈这两个程序怎么在手机上运行
  7. mybatis执行opensession时空指针异常_关于 Mybatis 缓存的那点事儿,你知道吗?
  8. select tables optimized away
  9. 设置浏览器为【默认浏览器】的两种方式
  10. idea lib下有jar包但是仍然报错 找不到类