- 浏览: 180571 次
文章分类
最新评论
-
bee1314:
谢谢分享,今天也碰到类似的问题!
收藏:Hibernate的Like用法 -
xp84012493:
很好的资料,谢谢啦
收藏:hibernate应用配置说明-middlegen和hbm2java的配置 -
bushkarl:
...
收藏:Hibernate---Criteria -
joeyee:
JScud Develop ...
使用FreeMarker生成Html静态文件(转载) -
yvonxiao:
查资料中路过,谢谢博主分享
收藏:Hibernate中的取策略延迟加载
具有一个直观的、可扩展的条件查询API是Hibernate的特色。 15.1. 创建一个Criteria 实例 org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。 Criteria crit = sess.createCriteria(Cat.class); crit.setMaxResults(50); List cats = crit.list(); 15.2. 限制结果集内容 一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list(); 约束可以按逻辑分组。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list(); List cats = sess.createCriteria(Cat.class) .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull("age") ) .add( Restrictions.eq("age", new Integer(0) ) ) .add( Restrictions.eq("age", new Integer(1) ) ) .add( Restrictions.eq("age", new Integer(2) ) ) ) ) .list(); Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) ) .list(); {alias}占位符应当被替换为被查询实体的列别名。 Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。 Property age = Property.forName("age"); List cats = sess.createCriteria(Cat.class) .add( Restrictions.disjunction() .add( age.isNull() ) .add( age.eq( new Integer(0) ) ) .add( age.eq( new Integer(1) ) ) .add( age.eq( new Integer(2) ) ) ) ) .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) .list(); 15.3. 结果集排序 你可以使用org.hibernate.criterion.Order来为查询结果排序。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list(); List cats = sess.createCriteria(Cat.class) .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc() ) .addOrder( Property.forName("age").desc() ) .setMaxResults(50) .list(); 15.4. 关联 你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .createCriteria("kittens") .add( Restrictions.like("name", "F%") .list(); 注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。 接下来,替换形态在某些情况下也是很有用的。 List cats = sess.createCriteria(Cat.class) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Restrictions.eqProperty("kt.name", "mt.name") ) .list(); (createAlias()并不创建一个新的 Criteria实例。) Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。 List cats = sess.createCriteria(Cat.class) .createCriteria("kittens", "kt") .add( Restrictions.eq("name", "F%") ) .returnMaps() .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"); } 15.5. 动态关联抓取 你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .setFetchMode("mate", FetchMode.EAGER) .setFetchMode("kittens", FetchMode.EAGER) .list(); 这个查询可以通过外连接抓取mate和kittens。 查看第 19.1 节 “ 抓取策略(Fetching strategies) ”可以获得更多信息。 15.6. 查询示例 org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。 Cat cat = new Cat(); cat.setSex('F'); cat.setColor(Color.BLACK); List results = session.createCriteria(Cat.class) .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 case insensitive string comparisons .enableLike(); //use like for string comparisons List results = session.createCriteria(Cat.class) .add(example) .list(); 你甚至可以使用examples在关联对象上放置条件。 List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .createCriteria("mate") .add( Example.create( cat.getMate() ) ) .list(); 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。 List results = session.createCriteria(Cat.class) .setProjection( Projections.rowCount() ) .add( Restrictions.eq("color", Color.BLACK) ) .list(); List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list(); 在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。 你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式: List results = session.createCriteria(Cat.class) .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) .addOrder( Order.asc("colr") ) .list(); List results = session.createCriteria(Cat.class) .setProjection( Projections.groupProperty("color").as("colr") ) .addOrder( Order.asc("colr") ) .list(); alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名: List results = session.createCriteria(Cat.class) .setProjection( 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.class, "cat") .createAlias("kittens", "kit") .setProjection( Projections.projectionList() .add( Projections.property("cat.name"), "catName" ) .add( Projections.property("kit.name"), "kitName" ) ) .addOrder( Order.asc("catName") ) .addOrder( Order.asc("kitName") ) .list(); 你也可以使用Property.forName()来表示投影: List results = session.createCriteria(Cat.class) .setProjection( Property.forName("name") ) .add( Property.forName("color").eq(Color.BLACK) ) .list(); List results = session.createCriteria(Cat.class) .setProjection( 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(); 15.8. 离线(detached)查询和子查询 DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。 DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq('F') ); Session session = ....; Transaction txn = session.beginTransaction(); List results = query.getExecutableCriteria(session).setMaxResults(100).list(); txn.commit(); session.close(); DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。 DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class) .setProjection( Property.forName("weight").avg() ); session.createCriteria(Cat.class) .add( Property.forName("weight).gt(avgWeight) ) .list(); DetachedCriteria weights = DetachedCriteria.forClass(Cat.class) .setProjection( Property.forName("weight") ); session.createCriteria(Cat.class) .add( Subqueries.geAll("weight", weights) ) .list(); 甚至相互关联的子查询也是有可能的: DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2") .setProjection( Property.forName("weight").avg() ) .add( Property.forName("cat2.sex").eqProperty("cat.sex") ); session.createCriteria(Cat.class, "cat") .add( Property.forName("weight).gt(avgWeightForSex) ) .list(); //具体应用 把HSQL语句用Criteria代替,感觉更加美观一点,而且还支持中文,要是HSQL想支持中文,你得使用占位符来设置,具体可参照:http://.blogdriver.com//983190.html 那么Criteria的用法是这样的: public Collection findCriteria(final DetachedCriteria dc, final IPage page) { return (List) getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Criteria c = dc.getExecutableCriteria(session); page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue()); c.setProjection(null); c.setResultTransformer(Criteria.ROOT_ENTITY); c.setFirstResult(page.getBeginIndex()); c.setMaxResults(page.getPageSize()); return c.list(); } }, true); } 其中的参数true表示要Spring强制传入SessionImpl,而不是传入Proxy代理类,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue()); c.setProjection(null); 目的是为了获得行数,并设置投影为空,为的是返回List出来,如果不设置setProjection(null)的话,c.list将返回的是行数(int型),而不是所要查询的数据库信息。但是Criteria的ResultTransformer会变成PassThroughResultTransformer,criteria.list的时候可能结果会跟理想的不一样。所以我们还要再c.setResultTransformer(Criteria.ROOT_ENTITY);把结果以Entity的形式返回,而不是Object[]的形式返回。具体的ResultTransformer可以google一下。 测试代码如下: public void testCriteria() { DetachedCriteria dc = DetachedCriteria.forClass(User.class); dc.add(Restrictions.eq("name", "user")).add(Restrictions.like("description", "%主管人员%")); IPage page = new Page(); page.setCurrentPage(1); page.setPageSize(10); Collection list = _userDAO.findCriteria(dc, page); assertNotNull(list); assertEquals(1, list.size()); } 来源:http://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=898571
评论
3 楼
bushkarl
2010-09-05
2 楼
wubaodan
2007-08-27
是不是Criteria只能查询该表中的全部列,是否能过滤掉不需要的列呢?
1 楼
wubaodan
2007-08-27
楼主你好,看了您的以上关于Criteria的查询例子,我觉得写的很全面,我有个问题就是关于Criteria的查询怎么查询一个表中几个列的list不知道怎么写,请指教,比如 hql:select u.name,u.age from user u
发表评论
-
openSession() 与 getCurrentSession() 比较
2009-12-07 15:33 12581 getCurrentSession创建的session会和 ... -
转载:hibernate与应用缓存方案总结
2007-05-21 17:49 1367XXXX项目是目前在实际工作中正在做的事情,该项目是一个大型系 ... -
Hibernate访问多个数据库 作者:杨晓
2007-01-02 16:20 1553Hibernate访问多个数据库 ... -
(转)Hibernate如何设置一对多cascade
2006-11-16 09:39 1616... -
收藏:Hibernate的Like用法
2006-11-13 17:15 4399引用原本我的写法: Query repeatClientQue ... -
收藏:Hibernate综合查询解决方案
2006-11-13 14:02 1931... -
收藏:延迟初始化错误(ERROR LazyInitializer)是如何产生的?
2006-11-10 16:44 1577选自<<精通Hibernate ... -
收藏:Hibernate中的取策略延迟加载
2006-11-10 16:18 3559引用Hibernate中的取策略 ... -
整理问题:Session was closed
2006-11-10 16:05 5265引用 答案一: 当<class>元素或者< ... -
收藏:Hibernate中关联的相关问题
2006-11-09 15:27 2543引用注意unsaved-value是个很重要的属性。Hiber ... -
收藏:关于unsaved-value 的再问
2006-11-09 14:19 1449引用http://blog.csdn.net/chinaref ... -
收藏:Hibernate中Cascade和Inverse
2006-11-07 10:18 26831、到底在哪用cascade=&q ... -
收藏:ibatis hibernate 分页
2006-11-04 11:02 1564引用使用ibatis,hibernate等 ... -
收藏:hibernate应用配置说明-middlegen和hbm2java的配置
2006-11-04 10:54 2224hibernate应用配置说明-mid ... -
收藏:struts spring hibernate实现数据库记分页显示
2006-11-04 10:49 2906struts+spring+hibernate实现数据库记分页 ...
相关推荐
hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria
Hibernate-Criteria 模糊查询。介绍各种模糊查询的方法。
Hibernate-Criteria_模糊查询
entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public...
python库。 资源全名:criteria-etl-1.0a3.tar.gz
本文旨在为读者呈现不同的方式查询方式:HQL方式的查询、SQL原生态SQL方式的查询、以及Criteria方式的查询,拓展查询的不同实现思路,开阔视野、并涵盖了部分的Hibernate增删改的基本操作。
Hibernate的Criteria用法总结Hibernate的Criteria用法总结
使用 Hibernate Criteria && DetachedCriteria Queries演示Exists Clause非常简单的项目 安装 git clone https://github.com/RameshRM/hibernate-sample.git 跑步 mvn install 这是一个maven项目,依赖项是 ...
Hibernate Criteria 排序的問題
Simple Spring(Core,JPA,ORM,MVC)5个JPA 2 Hibernate 5项目,具有: 对于开发 实体管理器 SpringJPA + ORM CriteriaBuilder 元模型 数据库 P6间谍 SLF4J-SpringMVC 进行测试 Spring测试:SpringJUnit4Class...
关于Hibernate操作持久化类的Criteria方式的书本方法
Hibernate项目示例: 实体管理器 CriteriaBuilder 元模型 数据库 P6间谍 SLF4J
Hibernate中Criteria的完整用法
Criteria查询将数据查询条件封装成为一个对象,可以堪称是传统SQL的对象化表示。
这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友
Hibernate是开源的ORM对象关系映射框架,包括Session、SessionFactory、Transaction、Query、Criteria和Configuration六核心类和接口。
Multi-Criteria Chinese Word Segmentationwith Transformer 译文 谷歌翻译版,仅供参考
hibernate criteria 分组 排序 关联 hibernate criteria 分组 排序 关联