千家信息网

Hibernate Criteria进阶查询怎么使用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"Hibernate Criteria进阶查询怎么使用",在日常操作中,相信很多人在Hibernate Criteria进阶查询怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2026年11月03日Hibernate Criteria进阶查询怎么使用

这篇文章主要介绍"Hibernate Criteria进阶查询怎么使用",在日常操作中,相信很多人在Hibernate Criteria进阶查询怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Hibernate Criteria进阶查询怎么使用"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。这就是Criteria进阶查询。

排序
您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据"age"由小到大排序(反之则使用desc()):

Criteria criteria = session.createCriteria(User.class);  criteria.addOrder(Order.asc("age"));  List users = criteria.list();

注意在加入Order条件时,使用的是addOrder()方法,而不是add()方法,在产生SQL语句时,会使用order by与asc(desc)来进行排序指定:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc

限定查询笔数
Criteria的setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果***笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):

Criteria criteria = session.createCriteria(User.class);  criteria.setFirstResult(51);  criteria.setMaxResults(50);  List users = criteria.list();

根据您所指定得资料库,Hibernate将自动产生与资料库相依的限定笔数查询子句,例如在MySQL中,将使用limit产生以下的SQL语句:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?

统计动作
您可以对查询结果进行统计动作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:

Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(Projections.avg("age"));  List users = criteria.list();

上面的程式将由Hibernate自动产生SQL的avg函数进行平均计算:

Hibernate: select avg(this_.age) as y0_ from T_USER this_

分组
还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有 20、20、25、30,则以下会显示20、25、30:

Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(Projections.groupProperty("age"));  List users = criteria.list();

上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:

Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age

如果想同时结合统计与分组功能,则可以使用org.hibernate.criterion.ProjectionList,例如下面的程式会计算每个年龄各有多少个人:

ProjectionList projectionList = Projections.projectionList();  projectionList.add(Projections.groupProperty("age"));  projectionList.add(Projections.rowCount());    Criteria criteria = session.createCriteria(User.class);  criteria.setProjection(projectionList);  List users = criteria.list();

观察所产生的SQL语句,将使用group by先进行分组,再针对每个分组进行count函数的计数,

Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age

根据已知物件进行查询
设定查询条件并非一定要使用Restrictions,如果属性条件很多,使用Restrictions也不方便,如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:

User user = new User();  user.setAge(new Integer(30));   Criteria criteria = session.createCriteria(User.class);  criteria.add(Example.create(user));   List users = criteria.list();

Criteria进阶查询中,您可以透过 org.hibernate.criterion.Example的create()方法来建立Example实例,Example实作了 Criteria介面,因此可以使用add()方法加入至Criteria条件设定之中,Hibernate将自动过滤掉空属性,根据已知物件上已设定的属性,判定是否产生于where子句之中:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)

设定SQL范本
如果您了解如何撰写SQL语句,想要设定一些Hibernate产生SQL时的范本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL语法范本作限定查询,例如查询name以cater开头的资料:

Criteria criteria = session.createCriteria(User.class);  criteria.add(Restrictions.sqlRestriction(  "{alias}.name LIKE (?)", "cater%", Hibernate.STRING));  List users = criteria.list();

其中alias将被替换为与User类别相关的名称,而? 将被替换为cater%,也就是第二个参数所提供的值,sqlRestriction()方法***个参数所设定的是where子句的部份,所以在SQL撰写时,不必再写where,观察所产生的SQL语句,将使用您所设定的SQL范本作为基础,来完成SQL的条件查询:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)

如果有多个查询条件,例如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();

观察所产生的SQL语句如下:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)

到此,关于"Hibernate Criteria进阶查询怎么使用"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

查询 方法 分组 条件 资料 进阶 子句 语句 物件 结果 排序 属性 范本 学习 统计 功能 程式 观察所 面的 观察 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 中关村互联网科技集团 互联网科技活动banner 互联网为科技 为想互联网科技 互联网与未来科技 广西互联网科技公司 郑州华宇互联网科技 深圳卡尔迅互联网科技有限公司怎么样 广州恒生互联网科技有限 银川新华互联网科技学校联系电话 翼展科技 首家互联网医院 朱啸虎曾投资哪些互联网科技企业 有人说阿里系是互联网科技企业 南京一网一红互联网科技有限公司 全球科技与互联网公司市值变化 唯美互联网科技 科技信息时代互联网发展 广州三三互联网科技有限公司 互联网科技创业有什么好项目 互联网科技博客 蓝色互联网科技 上海电发互联网科技有限公司 中国科技互联网公司收入 剑昆互联网络科技有限公司临桂 开一家科技互联网公司需要多少钱 互联网科技研发水平 工业互联网等科技实现智能化赋能 恒生互联网科技业指数调整周期 云南省自由互联网科技有限公司
0