- 浏览: 801895 次
- 性别:
- 来自: 淄博
文章分类
- 全部博客 (250)
- Hibernate (29)
- FCKEditor (5)
- Jstl (6)
- JavaScript (33)
- 异常备忘 (49)
- Mysql (1)
- XP小技巧 (8)
- Java基础 (48)
- Freemarker (6)
- Birt (5)
- SQL (22)
- Spring (13)
- XHTML+CSS (7)
- Struts (5)
- ExtJs (13)
- Tomcat (7)
- JFreeChart (1)
- Json-Lib (0)
- Jquery&EasyUI (22)
- MyEclipse (4)
- Firefox (1)
- Apache Shiro (1)
- Oracle (5)
- Spring Security (2)
- SQLServer (6)
- Bootstrap (1)
- POI (2)
- SpringMVC (4)
最新评论
-
xinglianxlxl:
对我有用,谢谢
Spring 定时任务之 @Scheduled cron表达式 -
cb_2017:
...
Spring 定时任务之 @Scheduled cron表达式 -
a251628111:
谢谢分享
Spring 定时任务之 @Scheduled cron表达式 -
hl174:
确实是这个问题 不知道谁把数据库改了
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss -
gotosuzhou:
zhangzi 写道lylshr 写道顶,大哥你真强啊晕死,这 ...
数据库是SQLServer2008,出现'limit' 附近有语法错误
当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Criteria实例中。这样,程序员可以不使用SQL甚至HQL的情况下进行数据查询,如例程9-1所示。
例程9-1 Criteria应用实例
cr.add(Restrictions.eq("name", "Bill"));//等价于where name=’Bill’
List list = cr.list();
Student stu = (Student)list.get(0);
System.out.println(stu.getName());
1.常用的查询限制方法
在例程9-1中,Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制。这些方法及其他一些criteria常用查询限制方法列于表9-1中。
表9-1 Criteria Query常用的查询限制方法
方 法 |
说 明 |
Restrictions.eq() |
equal,= |
Restrictions.allEq() |
参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果 |
Restrictions.gt() |
greater-than, > |
Restrictions.lt() |
less-than, < |
Restrictions.le() |
less-equal, <= |
Restrictions.between() |
对应SQL的between子句 |
Restrictions.like() |
对应SQL的like子句 |
Restrictions.in() |
对应SQL的in子句 |
Restrictions.and() |
and关系 |
Restrictions.or() |
or关系 |
Restrictions.isNull() |
判断属性是否为空,为空返回true,否则返回false |
Restrictions.isNotNull() |
与Restrictions.isNull()相反 |
Order.asc() |
根据传入的字段进行升序排序 |
Order.desc() |
根据传入的字段进行降序排序 |
MatchMode.EXACT |
字符串精确匹配,相当于“like 'value'” |
MatchMode.ANYWHERE |
字符串在中间位置,相当于“like '%value%'” |
MatchMode.START |
字符串在最前面的位置,相当于“like 'value%'” |
MatchMode.END |
字符串在最后面的位置,相当于“like '%value'” |
例1:查询学生名字以t开头的所有Student对象。
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t%”)) List list = cr.list(); Student stu = (Student)list.get(0); |
或者使用另一种方式:
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “t”, MatchMode.START)) List list = cr.list(); Student stu = (Student)list.get(0); |
例2:查询学生姓名在Bill, Jack和Tom之间的所有Student对象。
String[] names = {“Bill”, “Jack”, “Tom”} Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.in(“name”, names)) List list = cr.list(); Student stu = (Student)list.get(0); |
例3:查询学生的年龄age等于22或age为空(null)的所有Student对象。
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.eq(“age”, new Integer(22)); cr.add(Restrictions.isNull(“age”)); List list = cr.list(); Student stu = (Student)list.get(0); |
例4:查询学生姓名以字母F开头的所有Student对象,并按姓名升序排序。
Criteria cr = session.createCriteria(Student.class); cr.add(Restrictions.like(“name”, “F%”); cr.addOrder(Order.asc(“name”)); List list = cr.list(); Student stu = (Student)list.get(0); |
调用Order.asc的方法应是Criteria的addOrder()方法。
使用add()方法加入条件时,预设是使用and来组合条件,如果要用or的方式来组合条件,则可以使用Restrictions.or()方法,例如结合age等于(eq)20或(or)age为空(isNull)的条件:
- Criteria criteria = session.createCriteria(User.class);
- criteria.add(Restrictions.or(
- Restrictions.eq("age", new Integer(20)),
- Restrictions.isNull("age")
- ));
- List users = criteria.list();
观察所产生的SQL语句,将使用where与or子句完成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=? or this_.age is null)
使用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 (?)
2.连接限制
在Criteria 查询中使用FetchMode来实现连接限制。在HQL语句中,可以通过fetch关键字来表示预先抓取(Eager fetching),如下所示:
from Group g left join fetch g.students s where g.name like '%2005' |
可以使用Criteria的API完成同样的功能,如下所示:
Criteria cr = session.createCriteria(Group.class); cr.setFetchMode(“students”, FetchMode.EAGER); cr.add(Restrictions.like(“name”, “2005”, MatchMode.END)) List list = cr.list(); |
以上两种方式编写的代码,都使用相同的SQL语句完成它们的功能,如下所示:
select g.*, s.* from Group g left outer join Student s on g.id = s.group_id where g.name like '%2005' |
发表评论
-
Hibernate SQL查询:No Dialect mapping for JDBC type: -9
2018-04-12 09:21 527Hibernate执行SQL语句遇到的错误,是数据类型异常 ... -
Encountered a duplicated sql alias [] during auto-discovery of a native-sql quer
2017-04-07 10:38 1726Encountered a duplicated sql a ... -
Hibernater由于外键设置不为空,导致在主键级联删除时失败解决办法!
2016-11-22 15:19 582媒体表 @Entity public class Me ... -
java数据类型,hibernate数据类型,标准sql数据类型之间的对应表
2016-09-09 08:14 661Hibernate API简 ... -
java.lang.NullPointerException: null
2015-11-03 08:24 15802015-11-03 08:14:54.332 [local ... -
出现“java.sql.SQLException: 无法转换为内部表示”解决方法
2015-09-25 09:52 2416出现“java.sql.SQLException: 无法转换 ... -
Hibernate中的对象状态,及自动更新原因
2015-02-26 15:33 498Hibernate的对象有三种状态,分别为:瞬时状态 (Tr ... -
Batch update returned unexpected row count from update [0]; actual row count: 0;
2015-01-16 10:54 722Batch update returned unexpec ... -
hibernate annotation 之 主键生成策略
2015-01-05 11:17 738Hibernate 默认总共支持 1 ... -
缓存简介--Cache In Hibernate
2013-02-19 14:02 1015缓存可以简单的看成一个 Map ,通过 key 在缓存里面找 ... -
hibernate4 分页报只进结果集不支持请求的操作的解决办法
2012-12-24 17:44 3340com.microsoft.sqlserver.jdbc.SQ ... -
Hibernate中的merge使用详情
2012-12-18 15:39 1084merge的作用是: 新new一个对象, 如果该对象设置了 ... -
should be mapped with insert="false"
2012-06-07 14:14 791org.hibernate.MappingException: ... -
java.lang.NoClassDefFoundError: javax/persistence/Access
2012-06-07 14:13 1493ejb3-persistence.jar中没有此类,需要hib ... -
exception is java.lang.NoSuchFieldError: INSTANCE
2012-06-07 14:11 9769org.springframework.beans.BeanI ... -
java.sql.SQLException: ORA-00904: "CHARINDEX": 标识符无效
2011-12-13 10:41 2917java.sql.SQLException: ORA-0090 ... -
关于Hibernate select count(*)返回值为Long还是Integer?
2011-07-20 09:00 2619java.lang.classcastexception ja ... -
hibernate.properties配置
2010-11-29 12:19 1578Hibernate配置属性 属性名 用 ... -
A ResourcePool could not acquire a resource from its primary factory or source
2010-11-09 08:42 4304启动tomcat的时候出现如下异常 com.mchange. ... -
save/update/saveOrUpdate无效
2010-10-19 10:12 1791当你的Manager中的save/update/saveOrU ...
相关推荐
对于简单的查询场景,使用HQL(Hibernate Query Language)即可轻松实现排序功能;但对于复杂的多表关联查询场景,则需要借助Criteria API来灵活构建查询条件。本文将围绕给定的代码片段,深入探讨Hibernate ...
在Java持久层框架...然而,对于非常复杂的查询,HQL(Hibernate Query Language)可能会更适合,因为它更接近SQL,能更好地表达复杂的查询逻辑。理解并熟练运用Criteria API,能有效提升在Hibernate中的查询效率。
### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...
### Hibernate Criteria 使用方法详解 #### 一、简介 Hibernate 是一款非常流行的 Java 持久层框架,它简化了对象关系映射(ORM)过程中的许多复杂性。在 Hibernate 中,Criteria API 提供了一种类型安全的方式来...
1. **HQL(Hibernate Query Language)** HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但操作的对象是对象而非表。例如,要获取所有用户,可以使用以下HQL语句: ```java Query query = session....
Hibernate Criteria API 是一种面向对象的查询方式,它提供了一种比HQL(Hibernate Query Language)更为简洁且直观的查询手段。通过Criteria API,开发者可以构建复杂的查询条件,无需直接编写SQL,使得代码更加...
CriteriaQuery<YourEntityName> criteriaQuery = builder.createQuery(YourEntityName.class); Root<YourEntityName> root = criteriaQuery.from(YourEntityName.class); TypedQuery<YourEntityName> typedQuery ...
在实际应用中,你还可以结合Hibernate的 Criteria 查询、Criteria API 或者 JPA 的 Query API 来实现更复杂的聚合查询,如带条件的聚合、子查询等。 总之,Hibernate提供的聚合函数使得在Java应用程序中进行数据...
Hibernate 中 Criteria 的完整用法 Hibernate 中 Criteria 的完整用法是 Hibernate 框架中的一种查询机制,允许开发者灵活地根据查询条件来组装查询语句。在使用 Spring 和 Hibernate 进行开发时,Criteria 的优势...
Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时...在实际项目中,可以根据需求选择使用HQL(Hibernate Query Language)或Criteria API,两者各有优势,选择取决于具体场景和团队偏好。
在Java的持久化框架Hibernate中,Criteria API是一种用于构建动态查询的强大工具,它允许开发者以编程方式构建查询,而不是直接写SQL语句。下面将详细解释Criteria API的使用及其相关概念。 1. Query By Example ...
- 新增强的Hibernate Criteria Query API,提供了更多高级的查询构建选项。 - HQL,作为核心的查询语言,支持更广泛的查询模式。 - 对于原生SQL方言的支持得到了增强,允许开发者直接使用特定数据库的SQL特性。 ###...
### HIBERNATE_QUERY知识点详解 #### 一、概述 Hibernate作为一款强大的对象关系映射(ORM)框架,为Java开发者提供了一套高效且简洁的方式来处理数据库操作。它支持多种查询方式,包括面向对象的查询语言(HQL)...
当然,随着项目的复杂度增加,可能还需要结合其他高级查询技术,如HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language),以满足更复杂的查询需求。但无论如何,掌握Hibernate-Criteria的模糊...
Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...
通过阅读`Hibernate--Criteria`中的源码,你可以深入了解Criteria API的工作原理,以及如何与其他Hibernate组件(如SessionFactory、Session和Query)协同工作。理解源码能帮助你在实际项目中更好地应用和优化...
在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...
Hibernate QBC(Query By Criteria)查询是Criteria查询的另一种表达方式,其本质与Criteria查询相同,都是通过构建对象化的查询条件执行SQL。在QBC中,`Expression`类的角色被`Restrictions`类取代,但工作方式类似...
8. **查询**: Hibernate支持HQL(Hibernate Query Language)和 Criteria API,它们提供了面向对象的查询方式。另外,还可以使用原生的SQL查询并通过`@NamedNativeQuery`进行配置。 在这个"Spring4Hibernate5MVC...
Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...