<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>criteria</title>
	<atom:link href="https://www.aitaocui.cn/tag/184223/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Wed, 23 Nov 2022 10:21:15 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>criteria</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>criteria(查询方式)</title>
		<link>https://www.aitaocui.cn/article/288847.html</link>
					<comments>https://www.aitaocui.cn/article/288847.html#respond</comments>
		
		<dc:creator><![CDATA[苏格兰公投]]></dc:creator>
		<pubDate>Wed, 23 Nov 2022 10:21:15 +0000</pubDate>
				<category><![CDATA[百科]]></category>
		<category><![CDATA[criteria]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=288847</guid>

					<description><![CDATA[Criteria是一种比hql更面向对象的查询方式。Criteria可使用Criterion和Projection设置查询条件。可以设置FetchMode(联合查询抓取的模式)，设...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>Criteria是一种比hql更面向对象的查询方式。Criteria可使用Criterion和Projection设置查询条件。可以设置FetchMode(联合查询抓取的模式)，设置排序方式,Criteria还可以设置FlushModel（冲刷Session的方式）和LockMode（数据库锁模式）。Project主要是让Criteria能够进行报表查询，并可以实现分组。Project主要有SimpleProjection、ProjectionList和Property三个实现。其中SimpleProjection和ProjectionList的实例化是由内建的Projections来完成，如提供的avg、count、max、min、sum可以让开发者很容易对某个字段进行统计查询。</p>
</article>
<article>
<h1>概述</h1>
<p>Criterion是Criteria的查询条件。Criteria提供了add(Criterion criterion)方法来添加查询条件。</p>
<p>createCriteria方法用于创建一个新的Criteria对象，该方法用在执行连接查询时。</p>
<p>Criterion接口的主要实现包括:Example、Junction和SimpleExpression。而Junction的实际使用是它的两个子类conjunction和disjunction，分别是使用AND和OR操作符进行来联结查询条件集合。</p>
<p>.enableLike(MatchMode.ANYWHERE);//对String类型的属性，无论在那里值在那里都匹配。相当于%value%</p>
<p>Property是对某个字段进行查询条件的设置，如通过Porperty.forName(“color”). in(new String[]{“black”,”red”,”write”});则可以创建一个Project实例。通过criteria的add(Project)方法加入到查询条件中去。</p>
<h1>创建和组装</h1>
<p>1.创建一个Criteria实例</p>
<p>org.hibernate.Criteria接口表示特定持久类的一个查询。Session是Criteria实例的工厂。</p>
<p>Criteria crit = sess.createCriteria(Cat.class);</p>
<p>crit.setMaxResults(50);</p>
<p>List cats = crit.list();</p>
<p>2.限制结果集内容</p>
<p>一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。</p>
<p>org.hibernate.criterion.Restrictions类定义了获得某些内置Criterion类型的工厂方法。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add( Restrictions.like(&quot;name&quot;, &quot;Fritz%&quot;) )</p>
<p>.add( Restrictions.between(&quot;weight&quot;, minWeight, maxWeight) )</p>
<p>.list();</p>
<p>约束可以按逻辑分组。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add( Restrictions.like(&quot;name&quot;, &quot;Fritz%&quot;) )</p>
<p>.add( Restrictions.or(</p>
<p>Restrictions.eq( &quot;age&quot;, new Integer(0) ),</p>
<p>Restrictions.isNull(&quot;age&quot;)</p>
<p>) )</p>
<p>.list();</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Restrictions. in( &quot;name&quot;, new String[] { &quot;Fritz&quot;, &quot;Izi&quot;, &quot;Pk&quot; } ) )</p>
<p>.add(Restrictions.disjunction()</p>
<p>.add(Restrictions.isNull(&quot;age&quot;) )</p>
<p>.add(Restrictions.eq(&quot;age&quot;, new Integer(0) ) )</p>
<p>.add(Restrictions.eq(&quot;age&quot;, new Integer(1) ) )</p>
<p>.add(Restrictions.eq(&quot;age&quot;, new Integer(2) ) )</p>
<p>))</p>
<p>.list();</p>
<p>Hibernate提供了相当多的内置criterion类型(Restrictions子类),但是尤其有用的是可以允许你直接使用SQL。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Restrictions.sql(&quot;lower({alias}.name) like lower(?)&quot;, &quot;Fritz%&quot;,</p>
<p>Hibernate.STRING) )</p>
<p>.list();</p>
<p>{alias}占位符应当被替换为被查询实体的列别名。</p>
<p>Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()创建一个</p>
<p>Property。</p>
<p>Property age = Property.forName(&quot;age&quot;);</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Restrictions.disjunction()</p>
<p>.add(age.isNull() )</p>
<p>.add(age.eq( new Integer(0) ) )</p>
<p>.add(age.eq( new Integer(1) ) )</p>
<p>.add(age.eq( new Integer(2) ) )</p>
<p>) )</p>
<p>.add(Property.forName(&quot;name&quot;).in( new String[] { &quot;Fritz&quot;, &quot;Izi&quot;, &quot;Pk&quot; } ) )</p>
<p>.list();</p>
<p>3.结果集排序</p>
<p>可以使用org.hibernate.criterion.Order来为查询结果排序。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Restrictions.like(&quot;name&quot;, &quot;F%&quot;)</p>
<p>.addOrder(Order.asc(&quot;name&quot;) )</p>
<p>.addOrder(Order.desc(&quot;age&quot;) )</p>
<p>.setMaxResults(50)</p>
<p>.list();</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Property.forName(&quot;name&quot;).like(&quot;F%&quot;) )</p>
<p>.addOrder(Property.forName(&quot;name&quot;).asc() )</p>
<p>.addOrder(Property.forName(&quot;age&quot;).desc() )</p>
<p>.setMaxResults(50)</p>
<p>.list();</p>
<p>4.关联</p>
<p>你可以使用createCriteria()非常容易的在互相关联的实体间建立约束。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add(Restrictions.like(&quot;name&quot;, &quot;F%&quot;)</p>
<p>.createCriteria(&quot;kittens&quot;)</p>
<p>.add(Restrictions.like(&quot;name&quot;, &quot;F%&quot;)</p>
<p>.list();</p>
<p>注意第二个createCriteria()返回一个新的Criteria实例，该实例引用kittens集合中的元素。</p>
<p>接下来，替换形态在某些情况下也是很有用的。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.createAlias(&quot;kittens&quot;, &quot;kt&quot;)</p>
<p>.createAlias(&quot;mate&quot;, &quot;mt&quot;)</p>
<p>.add(Restrictions.eqProperty(&quot;kt. name&quot;, &quot;mt. name&quot;) )</p>
<p>.list();</p>
<p>(createAlias()并不创建一个新的Criteria实例。)</p>
<p>Cat实例所保存的之前两次查询所返回的kittens集合是没有被条件预过滤的。如果你希望只获得</p>
<p>符合条件的kittens，你必须使用returnMaps()。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.createCriteria(&quot;kittens&quot;, &quot;kt&quot;)</p>
<p>.add( Restrictions.eq(&quot;name&quot;, &quot;F%&quot;) )</p>
<p>.returnMaps()</p>
<p>.list();</p>
<p>Iterator iter = cats.iterator();</p>
<p>while ( iter.hasNext() ) {</p>
<p>Map map = (Map) iter.next();</p>
<p>Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);</p>
<p>Cat kitten = (Cat) map.get(&quot;kt&quot;);</p>
<p>}</p>
<p>5.动态关联抓取</p>
<p>你可以使用setFetchMode()在运行时定义动态关联抓取的语义。</p>
<p>List cats = sess.createCriteria(Cat.class)</p>
<p>.add( Restrictions.like(&quot;name&quot;, &quot;Fritz%&quot;) )</p>
<p>.setFetchMode(&quot;mate&quot;, FetchMode.EAGER)</p>
<p>.setFetchMode(&quot;kittens&quot;, FetchMode.EAGER)</p>
<p>.list();</p>
<p>这个查询可以通过外连接抓取mate和kittens。</p>
<p>6.查询示例</p>
<p>org.hibernate.criterion.Example类允许你通过一个给定实例构建一个条件查询。</p>
<p>Cat cat = new Cat();</p>
<p>cat.setSex(&#x27;F&#x27;);</p>
<p>cat.setColor(Color.BLACK);</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.add( Example.create(cat) )</p>
<p>.list();</p>
<p>版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。</p>
<p>可以自行调整Example使之更实用。</p>
<p>Example example = Example.create(cat)</p>
<p>.excludeZeroes() //exclude zero valued properties</p>
<p>.excludeProperty(&quot;color&quot;) //exclude the property named &quot;color&quot;</p>
<p>.ignoreCase() //perform case insensitive string comparisons</p>
<p>.enableLike(); //use like for string comparisons</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.add(example)</p>
<p>.list();</p>
<p>甚至可以使用examples在关联对象上放置条件。</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.add( Example.create(cat) )</p>
<p>.createCriteria(&quot;mate&quot;)</p>
<p>.add( Example.create( cat.getMate() ) )</p>
<p>.list();</p>
<p>7.投影、聚合和分组</p>
<p>org.hibernate.criterion.Projections是Projection的实例工厂。通过调用setProjection()应用投影到一个查询。</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.rowCount() )</p>
<p>.add( Restrictions.eq(&quot;color&quot;, Color.BLACK) )</p>
<p>.list();</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.projectionList()</p>
<p>.add( Projections.rowCount() )</p>
<p>.add( Projections.avg(&quot;weight&quot;) )</p>
<p>.add( Projections.max(&quot;weight&quot;) )</p>
<p>.add( Projections.groupProperty(&quot;color&quot;) ))</p>
<p>.list();</p>
<p>在一个条件查询中没有必要显式的使用&quot;group by&quot;。某些投影类型就是被定义为分组投影，他们也出现在SQL的group by子句中。可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。</p>
<p>实现方式：</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.alias( Projections.groupProperty(&quot;color&quot;), &quot;colr&quot; ) )</p>
<p>.addOrder( Order.asc(&quot;colr&quot;) )</p>
<p>.list();?</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.groupProperty(&quot;color&quot;).as(&quot;colr&quot;) )</p>
<p>.addOrder( Order.asc(&quot;colr&quot;) )</p>
<p>.list();</p>
<p>alias()和as()方法简便的将一个投影实例包装到另外一个别名的Projection实例中。简而言之，当添加一个投影到一个投影列表中时你可以为它指定一个别名：</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.projectionList()</p>
<p>.add( Projections.rowCount(), &quot;catCountByColor&quot; )</p>
<p>.add( Projections.avg(&quot;weight&quot;), &quot;avgWeight&quot; )</p>
<p>.add( Projections.max(&quot;weight&quot;), &quot;maxWeight&quot; )</p>
<p>.add( Projections.groupProperty(&quot;color&quot;), &quot;color&quot; ))</p>
<p>.addOrder( Order.desc(&quot;catCountByColor&quot;) )</p>
<p>.addOrder( Order.desc(&quot;avgWeight&quot;) )</p>
<p>.list();</p>
<p>List results = session.createCriteria(Domestic.class, &quot;cat&quot;)</p>
<p>.createAlias(&quot;kittens&quot;, &quot;kit&quot;)</p>
<p>.setProjection( Projections.projectionList()</p>
<p>.add( Projections.property(&quot;cat. name&quot;), &quot;catName&quot; )</p>
<p>.add( Projections.property(&quot;kit. name&quot;), &quot;kitName&quot; ))</p>
<p>.addOrder( Order.asc(&quot;catName&quot;) )</p>
<p>.addOrder( Order.asc(&quot;kitName&quot;) )</p>
<p>.list();</p>
<p>也可以使用Property.forName()来表示投影：</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Property.forName(&quot;name&quot;) )</p>
<p>.add( Property.forName(&quot;color&quot;).eq(Color.BLACK) )</p>
<p>.list();</p>
<p>List results = session.createCriteria(Cat.class)</p>
<p>.setProjection( Projections.projectionList()</p>
<p>.add( Projections.rowCount().as(&quot;catCountByColor&quot;) )</p>
<p>.add( Property.forName(&quot;weight&quot;).avg().as(&quot;avgWeight&quot;) )</p>
<p>.add( Property.forName(&quot;weight&quot;).max().as(&quot;maxWeight&quot;) )</p>
<p>.add( Property.forName(&quot;color&quot;).group().as(&quot;color&quot; )</p>
<p>)</p>
<p>.addOrder( Order.desc(&quot;catCountByColor&quot;) )</p>
<p>.addOrder( Order.desc(&quot;avgWeight&quot;) )</p>
<p>.list();</p>
<p>8.离线(detached)查询和子查询</p>
<p>DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的Session来执行它。</p>
<p>DetachedCriteria query = DetachedCriteria.forClass(Cat.class)</p>
<p>.add( Property.forName(&quot;sex&quot;).eq(&#x27;F&#x27;) );</p>
<p>//创建一个Session</p>
<p>Session session = .;</p>
<p>Transaction txn = session.beginTransaction();</p>
<p>List results = query.getExecutableCriteria(session).setMaxResults(100).list();</p>
<p>txn.commit();</p>
<p>session.close();</p>
<p>DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过Subqueries或者</p>
<p>Property获得。</p>
<p>DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)</p>
<p>.setProjection( Property.forName(&quot;weight&quot;).avg() );</p>
<p>session.createCriteria(Cat.class)</p>
<p>.add( Property.forName(&quot;weight).gt(avgWeight) )</p>
<p>.list();</p>
<p>DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)</p>
<p>.setProjection( Property.forName(&quot;weight&quot;) );</p>
<p>session.createCriteria(Cat.class)</p>
<p>.add( Subqueries.geAll(&quot;weight&quot;, weights) )</p>
<p>.list();</p>
<p>相互关联的子查询也是有可能的：</p>
<p>DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, &quot;cat2&quot;)</p>
<p>.setProjection( Property.forName(&quot;weight&quot;).avg() )</p>
<p>.add( Property.forName(&quot;cat2.sex&quot;).eqProperty(&quot;cat.sex&quot;) );</p>
<p>session.createCriteria(Cat.class, &quot;cat&quot;)</p>
<p>.add( Property.forName(&quot;weight).gt(avgWeightForSex) )</p>
<p>.list();</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/288847.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
