Hibernate查询_Criteria
- 格式:ppt
- 大小:246.50 KB
- 文档页数:15
hibernate sql写法Hibernate是一个开源的、高效的、强大的Java持久化框架,它提供了面向对象的方式来操作关系型数据库。
使用Hibernate,开发者可以以一种简单、灵活的方式进行数据库操作,而无需编写大量的SQL 语句。
在Hibernate中,我们可以通过编写映射文件或注解来定义实体类与数据库表之间的映射关系,通过Session对象来执行对数据库的操作。
在Hibernate中,SQL语句可以通过多种方式来编写。
下面将针对Hibernate中的SQL编写进行详细介绍。
1. HQL(Hibernate Query Language)Hibernate Query Language(HQL)是一种面向对象的查询语言,它类似于SQL语句,但是使用的是实体类和属性名,而不是表名和列名。
HQL可以实现对实体对象的查询、更新和删除等操作。
以下是HQL的一些常用语法:-查询所有的实体对象:FROM实体类名-条件查询:FROM实体类名WHERE条件-投影查询:SELECT属性列表FROM实体类名-排序查询:FROM实体类名ORDER BY属性ASC/DESC-分页查询:FROM实体类名LIMIT开始位置,查询数量HQL的编写与SQL类似,但是可以直接使用实体类和属性名,从而更加面向对象。
例如,以下HQL语句可以查询出所有年龄大于18岁的用户:FROM User WHERE age > 182.原生SQL查询除了HQL,Hibernate还支持原生的SQL查询。
原生SQL查询可以直接编写传统的SQL语句,但是需要使用Session对象的createNativeQuery方法来执行。
以下是原生SQL查询的一些常用语法:-执行查询:session.createNativeQuery("SELECT * FROM表名").getResultList()-执行更新或删除:session.createNativeQuery("UPDATE/DELETE FROM表名WHERE条件").executeUpdate()-参数绑定:Query.setParameter(参数名,参数值)原生SQL查询可以更灵活地操作数据库,但是需要注意SQL语句的安全性和兼容性问题。
criteriaquery 检索nested类型-回复CriteriaQuery是Hibernate框架中的一种查询方法,用于进行复杂的查询操作。
在本文中,我们将重点介绍如何使用CriteriaQuery来检索nested类型的数据。
第一步:了解nested类型Nested类型是一种特殊的数据类型,它允许将一个文档嵌套在另一个文档中。
在关系型数据库中,我们通常使用外键来建立文档之间的关系,而在NoSQL数据库中,使用nested类型可以更方便地表示文档之间的嵌套关系。
第二步:创建实体类和映射文件在使用CriteriaQuery检索nested类型之前,我们首先需要创建相应的实体类和映射文件。
假设我们有两个实体类:Order和Product,其中Order中包含一个名为products的nested类型的属性。
我们可以使用注解或XML文件来定义实体类和映射关系。
第三步:创建CriteriaBuilder和CriteriaQuery对象在使用CriteriaQuery之前,我们需要创建CriteriaBuilder和CriteriaQuery对象。
CriteriaBuilder是用于构建查询条件的类,而CriteriaQuery是用于构建查询语句本身的类。
javaCriteriaBuilder cb = session.getCriteriaBuilder();CriteriaQuery<Order> cq = cb.createQuery(Order.class);Root<Order> root = cq.from(Order.class);第四步:创建Join对象由于我们要检索nested类型的数据,因此需要使用Join操作来处理嵌套在Order中的products属性。
我们可以使用CriteriaQuery的join方法来创建Join对象。
javaJoin<Order, Product> productJoin = root.join("products");第五步:设置查询条件在使用CriteriaQuery进行查询之前,我们还可以设置各种查询条件。
Hibernate查询首先介绍get()和load()方法的区别:get()方法和load()方法的区别主要在于对二级缓存的使用上。
load()方法会使用二级缓存,而get()方法在一级缓存没有找到会直接查询数据库,不会去二级缓存中查找。
get():如果在数据库中没有记录会返回空,get()无论如何都会返回数据.load():如果数据库中没有记录会抛出异常,如果有数据返回的是一个代理对象。
list和iterator()方法之间的区别:(N+1?)list()方法在执行时,直接运行查询结果所需要的查询语句。
iterator()方法则是先执行得到对象ID的查询,然后在根据每个ID值去取得所要查询的对象。
因此:对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句(N为结果集中的记录数).结果集的处理方法不同:list()方法会一次活的所有的结果集对象,而且他会依据查询的结果初始化所有的结果集对象。
如果在结果集非常庞大的时候会占据非常多的内存,甚至会造成内存溢出的情况发生。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。
一次在访问中可以控制缓存中对象的数量,以避免占用过多的缓存,导致内存溢出情况的发生。
HQL:HQL是一种面向对象的查询语言,HQL的操作对象是类、实例和属性等。
SQL:sql的操作对象是数据表和列等数据对象。
Hql是完全面向对象的查询语言,因此可以支持继承和多条等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象。
定参数的功能,Query 接口才是真正的HQL查询接口。
//创建一个Query 对象Java代码1Query query = session.createQuery ("from Customer as c where=:customerName and c.age=:customerAge");//动态绑定参数Java代码2query.setString("customerName","Tom");3query.setInteger("customerAge",21);//执行查询语句,返回结果Java代码4List result = query.list();HQL查询步骤:1:获取Hibernate Session对象。
hibernateCriteria关联查询hibernate Criteria 关联查询0、配置文件增加property-ref1、测试通过Criteria查询关联表;2、查询策略外连接;3、通过外键关联查询;4、配置文件增加inverse=true// Criteria查询语句的补充// 一、复合查询// 在这个一对多的例子中。
我们使用复合查询,查询所有用户及其地址。
// Criteria criteria = session.createCriteria(User.class);// List list = criteria.list();//// for (int i = 0; i < list.size(); i++) {// User user = (User) list.get(i);// System.out.println("\t user:"+i+" name is:" + user.getNam e());//// Set addrSet = user.getAddresses();// Iterator it = addrSet.iterator();// while(it.hasNext()){// Address addr = (Address)it.next();// System.out.println("\t\t user:"+i+" address is:"+addr.getA ddress());// }// }// 通过Criteria查询条件,我们可以查询位于上海的用户// Criteria criteria = session.createCriteria(User.class);//// Criteria addCriteria =// criteria.createCriteria("addresses");//这里addresses和User 类对应// addCriteria.add(Expression.like("address",// "%shanghai%"));//这里构造新的Criteria查询过滤条件// List list = criteria.list();//// for (int i = 0; i < list.size(); i++) {// User user = (User) list.get(i);// System.out.println("\t user:" + i + " name is:" + user.getN ame());//// Set addrSet = user.getAddresses();// Iterator it = addrSet.iterator();// while (it.hasNext()) {// Address addr = (Address) it.next();// System.out.println("\t\t user:" + i + " address is:"// + addr.getAddress());// }// }/zj%5Fchen/blog/item/35631384eb2f74 3267096e96.html4. 关联你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。
hibernate 中Criteria 的使用介绍要对资料库管理系统进行操作,最基本的就是使用SQL(Standard Query Language)语句,大部份的资料库都支援标准的SQL语句,然而也有一些特定于资料库的SQL语句,应用程式配合SQL 语句进行资料库查询时,若使用到特定于资料库的SQL语句,程式本身会有相依于特定资料库的问题。
使用Hibernate时,即使您不了解SQL的使用与撰写,也可以使用它所提供的API来进行SQL语句查询,org.hibernate.Criteria对SQL进行封装,您可以从Java物件的观点来组合各种查询条件,由Hibernate自动为您产生SQL语句,而不用特别管理SQL与资料库相依的问题。
以最基本的查询来说,如果您想要查询某个物件所对应的资料表中所有的内容,您可以如下进行查询:Criteria criteria = session.createCriteria(User.class);List users = criteria.list();for(Iterator it = users.iterator(); it.hasNext(); ) {User user = (User) it.next();System.out.println(user.getId() +" "t " + user.getName() +"/" + user.getAge());}Criteria建立后,若不给予任何的条件,预设是查询物件所对应表格之所有资料,如果您执行以上的程式片段,并于设定档中设定了了Hibernate的”show_sql”属性,则可以在主控下看到以下的SQL 语句之产生:Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_Criteria基本查询条件设定org.hibernate.Criteria实际上是个条件附加的容器,如果想要设定查询条件,则要使用org.hibernate.criterion.Restrictions的各种静态方法传回org.hibernate.criterion.Criteria实例,传回的每个org.hibernate.criterion.Criteria实例代表着一个条件,您要使用org.hibernate.Criteria的add()方法加入这些条件实例,例如查询”age”大于20且小于40的资料:Criteria criteria = session.createCriteria(User.class);criteria.add(Restrictions.gt("age", new Integer(20)));criteria.add(Restrictions.lt("age", new Integer(40)));List users = criteria.list();for(Iterator it = users.iterator(); it.hasNext(); ) {User user = (User) it.next();System.out.println(user.getId() +" "t " + user.getName() +"/" + user.getAge());}Restrictions的gt()方法表示大于(great than)的条件,而lt表示小于(less than)的条件,执行以上程式片段,观察所产生的SQL语句,将使用where与and子句产来完成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>? and this_.age使用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)您也可以使用Restrictions.like()方法来进行SQL中like子句的功能,例如查询”name”中名称为”just”开头的资料:Criteria criteria = session.createCriteria(User.class);criteria.add(Restrictions.like("name", "just%"));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_.name like ?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关係Criteria进阶查询条件设定使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。
criteria对象逻辑运算查询一、引言在许多数据库应用中,我们经常需要使用查询语句来检索符合特定条件的数据。
Criteria对象是Hibernate等ORM框架提供的一种用于构建复杂查询的方法,它允许我们在实体类或映射文件中创建复杂的查询条件。
在本篇文章中,我们将介绍Criteria对象中逻辑运算查询的基本概念和用法。
二、基本逻辑运算符在Criteria对象中,我们通常使用AND、OR和NOT等逻辑运算符来组合查询条件。
这些运算符可以根据需要组合多个属性比较、集合比较、函数查询等操作符,从而构建复杂的查询语句。
以下是一些常用的逻辑运算符:* AND:表示两个条件都必须满足。
* OR:表示两个条件中至少有一个满足。
* NOT:表示否定一个条件。
三、示例查询以下是一个使用Criteria对象进行逻辑运算查询的示例:假设我们有一个User实体类,其中包含id、name和age三个属性。
我们想要查询年龄大于等于18岁且姓名包含“张”的所有用户。
```java// 创建Criteria对象Criteria criteria = session.createCriteria(User.class);// 添加条件:年龄大于等于18岁criteria.add(Property.ge("age", 18));// 添加条件:姓名包含“张”criteria.add(Property.like("name", "张%"));// 执行查询List<User> users = criteria.list();```在上述示例中,我们首先创建了一个Criteria对象,并使用add 方法添加了两个条件:年龄大于等于18岁和姓名包含“张”。
最后,我们使用list方法执行查询,并获取符合条件的User对象的列表。
四、多重条件查询在某些情况下,我们可能需要同时满足多个条件。
hibernate 重写criteria的order排序方式在Hibernate中,要重写Criteria的排序方式,你可以使用`org.hibernate.criterion.Order`类,该类允许你指定排序的属性和排序方式。
下面是一个示例,展示如何使用Criteria进行排序:```javaimport org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Criteria;import org.hibernate.criterion.Order;import org.hibernate.criterion.Restrictions;import java.util.List;public class YourClass {public List<YourEntity> getDataWithCustomOrder(SessionFactory sessionFactory) { Session session = sessionFactory.openSession();Criteria criteria = session.createCriteria(YourEntity.class);// 添加一些条件,如果需要的话criteria.add(Restrictions.eq("someProperty", someValue));// 添加自定义排序criteria.addOrder(Order.asc("propertyName")); // 按升序排序// 或者criteria.addOrder(Order.desc("propertyName")); // 按降序排序List<YourEntity> result = criteria.list();session.close();return result;}}```在上述示例中,`YourEntity`是你要查询的实体类,`someProperty`是你添加的其他条件,`propertyName`是你要排序的属性名称。
hibernate:Hibernate中Criteria的完整使用方法疯狂代码 / ĵ:http://Java/Article58225.html 最近在项目中使用 Spring 和 Hibernate 进行开发有感于 Criteria 比较好用在查询思路方法设计上可以灵活根据 Criteria 特点来方便地进行查询条件组装现在对 HibernateCriteria 使用方法进行整理总结: Hibernate 设计了 CriteriaSpecication 作为 Criteria 父接口下面提供了 Criteria和DetachedCriteria Criteria 和 DetachedCriteria 主要区别在于创建形式不样 Criteria 是在线所以它是由 Hibernate Session 进行创建;而 DetachedCriteria 是离线创建时无需SessionDetachedCriteria 提供了 2 个静态思路方法forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 例子创建 Spring 框架提供了getHibernateTemplate.findByCriteria(detachedCriteria) 思路方法可以很方便地根据DetachedCriteria 来返回查询结果 Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件可以设置 FetchMode( 联合查询抓取模式 ) 设置排序方式对于 Criteria 还可以设置 FlushModel(冲刷 Session 方式)和 LockMode (数据库锁模式) 下面对 Criterion 和 Projection 进行详细介绍说明 Criterion 是 Criteria 查询条件Criteria 提供了 add(Criterion criterion) 思路方法来添加查询条件 Criterion 接口主要实现包括: Example 、 Junction 和 SimpleExpression 而 Junction 实际使用是它两个子类 conjunction 和 disjunction 分别是使用 AND 和 OR 操作符进行来联结查询条件集合 Criterion 例子可以通过 Restrictions 工具类来创建Restrictions 提供了大量静态思路方法如 eq (等于)、ge (大于等于)、 between 等来思路方法创建 Criterion 查询条件 (SimpleExpression 例子)除此的外Restrictions 还提供了思路方法来创建 conjunction 和 disjunction 例子通过往该例子 add(Criteria) 思路方法来增加查询条件形成个查询条件集合 至于 Example 创建有所区别 Example 本身提供了个静态思路方法 create(Object entity) 即根据个对象(实际使用中般是映射到数据库对象)来创建然后可以设置些过滤条件: Example exampleUser =Example.create(u) .ignoreCase // 忽略大小写 .enableLike(MatchMode.ANYWHERE); // 对 String 类型属性无论在那里值在那里都匹配相当于 %value% Project 主要是让 Criteria 能够进行报表查询并可以实现分组 Project 主要有 SimpleProjection 、ProjectionList 和 Property 3个实现其中SimpleProjection 和 ProjectionList 例子化是由内建 Projections 来完成如提供 avg 、 count 、 max 、 min 、 sum 可以让开发者很容易对某个字段进行统计查询 Property 是对某个字段进行查询条件设置如通过Porperty.forName(“color”).in(String{“black”,”red”,”write”}); 则可以创建个 Project 例子通过 criteria add(Project) 思路方法加入到查询条件中去 使用 Criteria 进行查询主要要清晰是 Hibernate 提供了那些类和思路方法来满足开发中查询条件创建和组装下面介绍几种使用方法: 1. 创建个Criteria 例子 org.hibernate.Criteria接口表示特定持久类个查询Session是 Criteria例子工厂Criteria crit = sess.createCriteria(Cat.);crit.MaxResults(50);List cats = crit.list; 2. 限制结果集内容 个单独查询条件是org.hibernate.criterion.Criterion 接口个例子 org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型工厂思路方法List cats = sess.createCriteria(Cat.) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list; 约束可以按逻辑分组List cats = sess.createCriteria(Cat.) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", Integer(0) ), Restrictions.isNull("age") ) ) .list;List cats = sess.createCriteria(Cat.) .add( Restrictions.in( "name", String { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.disjunction .add( Restrictions.isNull("age") ) .add( Restrictions.eq("age", Integer(0) ) ) .add( Restrictions.eq("age", Integer(1) ) ) .add( Restrictions.eq("age", Integer(2) ) ) ) ) .list; Hibernate提供了相当多内置criterion类型(Restrictions 子类), 但是尤其有用是可以允许你直接使用SQLList cats = sess.createCriteria(Cat.) .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",Hibernate.STRING) ) .list; {alias}占位符应当被替换为被查询实体列别名 Property例子是获得个条件另外种途径你可以通过Property.forName 创建个PropertyProperty age = Property.forName("age");List cats = sess.createCriteria(Cat.) .add( Restrictions.disjunction .add( age.isNull ) .add( age.eq( Integer(0) ) ) .add( age.eq( Integer(1) ) ) .add( age.eq( Integer(2) ) ) ) ) .add( Property.forName("name").in( String { "Fritz", "Izi", "Pk" } ) ) .list; 3. 结果集排序 你可以使用org.hibernate.criterion.Order来为查询结果排序List cats = sess.createCriteria(Cat.) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .MaxResults(50) .list;List cats = sess.createCriteria(Cat.) .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc ) .addOrder( Property.forName("age").desc ) .MaxResults(50) .list; 4. 关联 你可以使用createCriteria非常容易在互相关联实体间建立 约束List cats = sess.createCriteria(Cat.) .add( Restrictions.like("name", "F%") .createCriteria("kittens") .add( Restrictions.like("name", "F%") .list; 注意第 2个 createCriteria返回个新 Criteria例子该例子引用kittens 集合中元素 接下来替换形态在某些情况下也是很有用List cats = sess.createCriteria(Cat.) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Restrictions.eqProperty("", "") ) .list; (createAlias并不创建个新 Criteria例子) Cat例子所保存的前两次查询所返回kittens集合是 没有被条件预过滤如果你希望只获得符合条件kittens 你必须使用MapsList cats = sess.createCriteria(Cat.) .createCriteria("kittens", "kt") .add( Restrictions.eq("name", "F%") ) .Maps .list;Iterator iter = cats.iterator;while ( iter.hasNext ) { Map map = (Map) iter.next; Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS); Cat kitten = (Cat) map.get("kt");} 5. 动态关联抓取 你可以使用FetchMode在运行时定义动态关联抓取语义List cats = sess.createCriteria(Cat.) .add( Restrictions.like("name", "Fritz%") ) .FetchMode("mate", FetchMode.EAGER) .FetchMode("kittens", FetchMode.EAGER) .list; 这个查询可以通过外连接抓取mate和kittens 6. 查询举例 org.hibernate.criterion.Example类允许你通过个给定例子 构建个条件查询Cat cat = Cat;cat.Sex('F');cat.Color(Color.BLACK);List results = session.createCriteria(Cat.) .add( Example.create(cat) ) .list; 版本属性、标识符和关联被忽略默认情况下值为null属性将被排除 可以自行调整Example使的更实用Example example = Example.create(cat) .excludeZeroes //exclude zero valued properties .excludeProperty("color") //exclude the property named "color" .ignoreCase //perform insensitive comparisons .enableLike; //use like for comparisonsList results = session.createCriteria(Cat.) .add(example) .list; 甚至可以使用examples在关联对象上放置条件List results = session.createCriteria(Cat.) .add( Example.create(cat) ) .createCriteria("mate") .add( Example.create( cat.getMate ) ) .list; 7. 投影(Projections)、聚合(aggregation)和分组(grouping) org.hibernate.criterion.Projections是 Projection 例子工厂我们通过 Projection应用投影到个查询List results = session.createCriteria(Cat.) .Projection( Projections.rowCount ) .add( Restrictions.eq("color", Color.BLACK) ) .list;List results = session.createCriteria(Cat.) .Projection( Projections.projectionList .add( Projections.rowCount ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list; 在个条件查询中没有必要显式使用 "group by" 某些投影类型就是被定义为 分组投影他们也出现在SQLgroup by子句中 可以选择把个别名指派给个投影这样可以使投影值被约束或排序所引用下面是两种区别实现方式:List results = session.createCriteria(Cat.) .Projection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) .addOrder( Order.asc("colr") ) .list;List results = session.createCriteria(Cat.) .Projection( Projections.groupProperty("color").as("colr") ) .addOrder( Order.asc("colr") ) .list; alias和as思路方法简便将个投影例子包装到另外个 别名Projection例子中简而言的当你添加个投影到个投影列表中时 你可以为它指定个别名:List results = session.createCriteria(Cat.) .Projection( Projections.projectionList .add( Projections.rowCount, "catCountByColor" ) .add( Projections.avg("weight"), "avgWeight" ) .add( Projections.max("weight"), "maxWeight" ) .add( Projections.groupProperty("color"), "color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list;List results = session.createCriteria(Domestic., "cat") .createAlias("kittens", "kit") .Projection( Projections.projectionList .add( Projections.property(""), "catName" ) .add( Projections.property(""), "kitName" ) ) .addOrder( Order.asc("catName") ) .addOrder( Order.asc("kitName") ) .list; 也可以使用Property.forName来表示投影:List results = session.createCriteria(Cat.) .Projection( Property.forName("name") ) .add( Property.forName("color").eq(Color.BLACK) ) .list;List results = session.createCriteria(Cat.) .Projection( Projections.projectionList .add( Projections.rowCount.as("catCountByColor") ) .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; 8. 离线(detached)查询和子查询 DetachedCriteria类使你在个session范围的外创建个查询并且可以使用任意 Session来执行它DetachedCriteria query = DetachedCriteria.forClass(Cat.) .add( Property.forName("sex").eq('F') );//创建个SessionSession session = .;Transaction txn = session.beginTransaction;List results = query.getExecutableCriteria(session).MaxResults(100).list;mit;session.close; DetachedCriteria也可以用以表示子查询条件例子包含子查询可以通过 Subqueries或者Property获得DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.) .Projection( Property.forName("weight").avg );session.createCriteria(Cat.) .add( Property.forName("weight).gt(avgWeight) ) .list;DetachedCriteria weights = DetachedCriteria.forClass(Cat.) .Projection( Property.forName("weight") );session.createCriteria(Cat.) .add( Subqueries.geAll("weight", weights) ) .list; 相互关联子查询也是有可能:DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat., "cat2") .Projection( Property.forName("weight").avg ) .add( Property.forName("cat2.sex").eqProperty("cat.sex") );session.createCriteria(Cat., "cat") .add( Property.forName("weight).gt(avgWeightForSex) ) .list;2009-1-23 1:04:58疯狂代码 /。