﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-成熟的技术是成为架构师的基础</title><link>http://www.blogjava.net/YJSUN/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 06:28:39 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 06:28:39 GMT</pubDate><ttl>60</ttl><item><title>Hibernate条件查询</title><link>http://www.blogjava.net/YJSUN/archive/2007/05/11/116839.html</link><dc:creator>汪家吉</dc:creator><author>汪家吉</author><pubDate>Fri, 11 May 2007 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/YJSUN/archive/2007/05/11/116839.html</guid><wfw:comment>http://www.blogjava.net/YJSUN/comments/116839.html</wfw:comment><comments>http://www.blogjava.net/YJSUN/archive/2007/05/11/116839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/YJSUN/comments/commentRss/116839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/YJSUN/services/trackbacks/116839.html</trackback:ping><description><![CDATA[<p><font color=#993300><font size=2><strong>1、创建一个Criteria实例</strong><br>net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。&nbsp;</font></font></p>
<p><font color=#993300 size=2>Criteria&nbsp;crit&nbsp;=&nbsp;sess.createCriteria(Cat.class);<br>crit.setMaxResults(50);<br>List&nbsp;cats&nbsp;=&nbsp;crit.list();</font></p>
<p><br><font color=#993300><font size=2><strong>2、缩小结果集范围</strong><br>一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。&nbsp;</font></font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.between("weight",&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>表达式（Expressions）可以按照逻辑分组.&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.or(<br>&nbsp;&nbsp;&nbsp;&nbsp; Expression.eq(&nbsp;"age",&nbsp;new&nbsp;Integer(0)&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp; Expression.isNull("age")<br>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.in(&nbsp;"name",&nbsp;new&nbsp;String[]&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.disjunction()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.isNull("age")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(0)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(1)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp; .add(&nbsp;Expression.eq("age",&nbsp;new&nbsp;Integer(2)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>有很多预制的条件类型（Expression的子类）。有一个特别有用，可以让你直接嵌入SQL。&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.sql("lower($alias.name)&nbsp;like&nbsp;lower(?)",&nbsp;"Fritz%",&nbsp;Hibernate.STRING)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>其中的{alias}是一个占位符，它将会被所查询实体的行别名所替代。(原文:The&nbsp;{alias}&nbsp;placeholder&nbsp;with&nbsp;be&nbsp;replaced&nbsp;by&nbsp;the&nbsp;row&nbsp;alias&nbsp;of&nbsp;the&nbsp;queried&nbsp;entity.)&nbsp;</font></p>
<p><font color=#993300><font size=2><strong>3、对结果排序</strong><br>可以使用net.sf.hibernate.expression.Order对结果集排序.&nbsp;</font></font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc("name")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc("age")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(50)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><strong>4、关联（Associations）</strong><br>你可以在关联之间使用createCriteria()，很容易地在存在关系的实体之间指定约束。&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"F%")<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>注意，第二个createCriteria()返回一个Criteria的新实例，指向kittens集合类的元素。&nbsp;</font></p>
<p><font color=#993300 size=2>下面的替代形式在特定情况下有用。&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;</font><font color=#993300><font size=2><strong>sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kt")<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("mate",&nbsp;"mt")<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eqProperty("kt.name",&nbsp;"mt.name")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>（createAlias()）并不会创建一个Criteria的新实例。）&nbsp;</font></font></p>
<p><font color=#993300 size=2>请注意，前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤！如果你希望只返回满足条件的kittens,你必须使用returnMaps()。&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens",&nbsp;"kt")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.eq("name",&nbsp;"F%")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps()<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>Iterator&nbsp;iter&nbsp;=&nbsp;cats.iterator();<br>while&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;(Map)&nbsp;iter.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;=&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS);<br>&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;=&nbsp;(Cat)&nbsp;map.get("kt");<br>}<br></font><font color=#993300><font size=2><strong>5、动态关联对象获取（Dynamic&nbsp;association&nbsp;fetching）<br></strong>可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。&nbsp;</font></font></p>
<p><font color=#993300 size=2>List&nbsp;cats&nbsp;=&nbsp;sess.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Expression.like("name",&nbsp;"Fritz%")&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("mate",&nbsp;FetchMode.EAGER)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>这个查询会通过外连接(outer&nbsp;join)同时获得&nbsp;mate和kittens。&nbsp;</font></p>
<p><font color=#993300><font size=2><strong>6、根据示例查询（Example&nbsp;queries）</strong><br>net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。&nbsp;</font></font></p>
<p><font color=#993300 size=2>Cat&nbsp;cat&nbsp;=&nbsp;new&nbsp;Cat();<br>cat.setSex('F');<br>cat.setColor(Color.BLACK);<br>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>版本属性，表示符属性和关联都会被忽略。默认情况下，null值的属性也被排除在外。&nbsp;</font></p>
<p><font color=#993300 size=2>You&nbsp;can&nbsp;adjust&nbsp;how&nbsp;the&nbsp;Example&nbsp;is&nbsp;applied.&nbsp;你可以调整示例(Example)如何应用。&nbsp;</font></p>
<p><font color=#993300 size=2>Example&nbsp;example&nbsp;=&nbsp;Example.create(cat)<br>&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//exclude&nbsp;zero&nbsp;valued&nbsp;properties<br>&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty("color")&nbsp;&nbsp;//exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"<br>&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons<br>&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons<br>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(example)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br>你甚至可以用示例对关联对象建立criteria。&nbsp;</font></p>
<p><font color=#993300 size=2>List&nbsp;results&nbsp;=&nbsp;session.createCriteria(Cat.class)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("mate")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br></font></p>
<img src ="http://www.blogjava.net/YJSUN/aggbug/116839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/YJSUN/" target="_blank">汪家吉</a> 2007-05-11 18:39 <a href="http://www.blogjava.net/YJSUN/archive/2007/05/11/116839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>