查看文章
NHibernate Step by Step (五)Criteria Query2007-05-15 11:45NHibernate Step by Step (五)Criteria Query
可能很多人象我一样,刚开始接触HQL时,脑袋一片混沌,这是什么语法嘛!!之所以这样,是因为我们总是会先入为主地将之与SQL想比,虽然HQL看起来很SQL,而且设计时就有这样的意图,但是毕竟是两种差别很大的东西,难免就会出现理解偏差的问题。好了,我们今天就不让大家脑袋发晕了,HQL我们暂时放一放。今天我们来说另外一种查询方法:
Criteria Query.
什么是Criteria Query?简单说,就是将我们的查询条件封装为一个预定义的查询对象,由这个查询对象来执行查询,而不用我们再去写HQL了,而且更接近我们贯常的编程习惯。
是不是很不错?让我们来look look:
//创建关联到某个类的查询对象
ICriteria criteria = session.CreateCriteria(typeof(Person));
//添加表达式
criteria.Add(Expression.Eq("Name","Jackie Chan"));
IList list = criteria.List();
注意这一句:
Expression.Eq("Name","Jackie Chan")
Eq是Equal的缩写,意思是添加一个查询表达式,Person.Name = “Jackie Chan”
对应HQL就是:
from Person p where p.Name=”Jackie Chan”
NHibernate会在运行时动态生成类似上面的HQL,我们可以在配置文件把show-sql打开,观看生成的SQL。
这样是不是感觉清晰多了?又回到我们以前的编码习惯了!
为了对应HQL的种种查询条件,NHibernate预定义了大量的Expression方法,我们列几个如下:
Eq = Equal
Gt = Greater than
Lt = Less than
Like = Like
Not = Not
IsNull = Is Null
基本上对应了大部分
下面,我们详细介绍Criteria的用法。
1. Example查询
我们常常有这样的查询页面:
用户可以输入“姓名”、“性别”、“年龄”等等来进行查询,而我们常常的做法就是如下的烦琐:
string condition = “”;
if(txtName.Text != null)
condition += “ Name=” + txtName.Text;
if(txtSex.Text != null)
condition += “ and Sex=” + txtSex.Text;
……
代码看起来实在是不甚美观,有什么解决办法呢?
Criteria提供了专为这种问题而设计的Example查询,如下:
ICriteria criteria = session.CreateCriteria(typeof(Person));
Person person = new Person();
person.Name = "Jackie Chan";
person.Age = 50;
//创建一个Example对象
criteria.Add(Example.Create(person));
IList list = criteria.List();
请注意:
criteria.Add(Example.Create(person));
这句代码的意思是通过构造的person对象的属性来生成表达式,实际生成的代码如下:
SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE (this.age = @p0)
对应上面的问题,我们简单地new出一个person对象,然后填充其属性即可,不用再去构造那丑陋的条件判断语句了!
2. 排序
我们想对返回的list进行排序,该怎么办呢?如下:
ICriteria criteria = session.CreateCriteria(typeof(Person));
criteria.Add(Expression.Gt("Age", 20));
//添加一个排序对象
criteria.AddOrder(Order.Asc("Age"));
IList list = criteria.List();
请注意:
criteria.AddOrder(Order.Asc("Age"));
这句代码的意思是在criteria上构造一个排序对象,并以Age属性做正序排列,NHibernate在运行时会生成如下语句:
SELECT this.id as id0_, this.name as name0_, this.age as age0_ FROM Person this WHERE this.age > @p0 ORDER BY this.age asc
如你所猜想,Order类肯定有另外一个“Desc“方法:)
3. 限制记录范围
在显示大量的记录时,我们常常采用的方法就是分页,如果用NHibernate来做,该怎么办呢?
如下代码:
ICriteria criteria = session.CreateCriteria(typeof(Person));
//从第10条记录开始取
criteria.SetFirstResult(10);
//取20条记录
criteria.SetMaxResults(20);
IList list = criteria.List();
这样,我们就达到了分页的目的。
注意:
NHibernate的分页机制实际上依赖于不同的数据库实现,所以,对特定的某种数据库,并不一定是效率最好的,比如对SQLServer(为什么受伤的总是俺?为什么总是说俺比不上Oracle?俺都赶在2005年年底出2005版本了!!)。想知道为什么吗?很简单,check一下上面代码生成的SQL就清楚了!或者深入点再看看NHibernate的分页代码,我就不解释了,自己动手,丰衣足食:)
总体来讲,Criteria对我们来说更熟悉,更容易上手,但是目前Criteria还是不够完善——将对应的HQL一一封装实在太烦琐了,所以NHibernate还是以HQL查询为主,我们在使用的时候则看需要了,要么使用HQL,要么HQL和Criteria混合使用,重要的是解决问题,对不?
HQL的语义,详细的说明请参考api。
分享到:
相关推荐
1. **创建CriteriaQuery对象**: 首先,我们需要实例化CriteriaQuery,并指定返回的实体类型。 2. **设置Root**: 指定查询的实体,并关联到对应的数据库表。 3. **构建Predicate**: 使用CriteriaBuilder创建各种...
CriteriaQuery<YourEntityName> criteriaQuery = builder.createQuery(YourEntityName.class); Root<YourEntityName> root = criteriaQuery.from(YourEntityName.class); TypedQuery<YourEntityName> typedQuery ...
Hibernate 中 Criteria 的完整用法 Hibernate 中 Criteria 的完整用法是 Hibernate 框架中的一种查询机制,允许开发者灵活地根据查询条件来组装查询语句。在使用 Spring 和 Hibernate 进行开发时,Criteria 的优势...
### Hibernat 使用Criteria查询多对多关系(SET集合)条件 #### 背景介绍与概念理解 在Java开发中,特别是在企业级应用中,持久化层的处理至关重要。Hibernate作为一款流行的Java持久化框架,它提供了一种非常简便...
CriteriaQuery<?> criteriaQuery = builder.createQuery(); Root<?> root = criteriaQuery.from(entityClass); // ...构建查询条件... Query<?> query = entityManager.createQuery(criteriaQuery); query.setHint...
Criteria API基于CriteriaQuery接口,提供了丰富的查询选项,包括排序、分页、聚合函数等,这使得开发者能够更加灵活地进行数据检索。 ### 使用Criteria进行基本查询 在给定的部分内容中,首先展示的是如何使用...
Hibernate提供了多种查询方式,包括HQL(Hibernate Query Language)、Criteria Query和SQL查询。 1. Criteria Query: Criteria Query 是一种面向对象的查询方式,它允许我们通过构建Criteria对象来表示查询条件...
【J2EE Hibernate-4.ppt】主要讲解了在J2EE环境中使用Hibernate框架进行数据检索的方法,特别是Criteria Query的使用。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库...
Spring Data JPA 提供了多种方式来实现分页查询,包括使用 `Pageable`、`Specification` 和 `CriteriaQuery` 等。 使用 Pageable 实现分页查询 使用 `Pageable` 是 Spring Data JPA 中最简单的分页查询方式。可以...
- 新增强的Hibernate Criteria Query API,提供了更多高级的查询构建选项。 - HQL,作为核心的查询语言,支持更广泛的查询模式。 - 对于原生SQL方言的支持得到了增强,允许开发者直接使用特定数据库的SQL特性。 ###...
CriteriaQuery cq = new CriteriaQuery(Role.class, curPageNO, myaction); cq.setPageSize(10); PageSupport ps = BeanFactory.getInstance().getRightDelegate().findAllRole(cq, state); long l2 = System....
然后使用`CriteriaBuilder`来创建一个`CriteriaQuery`实例,并指定了返回类型为`Person`。接下来,我们定义了一个查询根(`Root`),并使用`CriteriaBuilder`提供的方法来构建查询条件。最后,我们使用`EntityManager`...
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class); Root<User> root = criteriaQuery.from(User.class); Predicate condition = criteriaBuilder.equal(root.get("username"), ...
- `CriteriaQuery`是用于封装Hibernate的QBC(Query By Criteria)查询的类,它接收实体类、当前操作的Action名称以及分页参数。在服务层,`findAllRole`方法将这些参数传递下去,并通过`getDelegate().execute(req)...
【Hibernate学习笔记】深入探讨Criteria Query 在Java的持久化框架Hibernate中,Criteria Query是一种强大的查询方式,它允许开发者以面向对象的方式构建SQL查询。这种查询方式提供了比HQL(Hibernate Query ...
javax.persistence.criteria.CriteriaQuery.class javax.persistence.criteria.Expression.class javax.persistence.criteria.Fetch.class javax.persistence.criteria.FetchParent.class javax.persistence....
9. CriteriaQuery和Root:CriteriaQuery用于定义查询的基本元素,如选择字段、指定条件等;Root则代表了查询的根实体,用于关联实体和查询。 10. Hibernate事件和监听器:允许开发者在特定操作(如对象加载、保存、...
CriteriaQuery<User> cq = cb.createQuery(User.class); Root<User> root = cq.from(User.class); cq.where(cb.equal(root.get("deleted"), false)); TypedQuery<User> query = session.createQuery(cq); List...
文档继续描述了Hibernate的两种查询方式,HQL(Hibernate Query Language)和Criteria Query。HQL是类似于SQL的查询语言,用于执行面向对象的查询操作。Criteria Query则提供了一种类型安全的方式来创建查询,它使用...