﻿<?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-                                  &lt;center&gt;&lt;font size=5&gt;心的方向&lt;/center&gt;-随笔分类-hibernate</title><link>http://www.blogjava.net/zilong/category/30722.html</link><description>                           &lt;center&gt;   新的征途...... &lt;/center&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 10 Apr 2008 10:05:24 GMT</lastBuildDate><pubDate>Thu, 10 Apr 2008 10:05:24 GMT</pubDate><ttl>60</ttl><item><title>hibernate 三种查询方式 </title><link>http://www.blogjava.net/zilong/archive/2008/04/10/191937.html</link><dc:creator>阿伟</dc:creator><author>阿伟</author><pubDate>Thu, 10 Apr 2008 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/zilong/archive/2008/04/10/191937.html</guid><wfw:comment>http://www.blogjava.net/zilong/comments/191937.html</wfw:comment><comments>http://www.blogjava.net/zilong/archive/2008/04/10/191937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zilong/comments/commentRss/191937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zilong/services/trackbacks/191937.html</trackback:ping><description><![CDATA[<p>转自：http://dev.csdn.net/article/68/68297.shtm<br />
<span id="ArticleTitle1_ArticleTitle1_lblTitle">hibernate 三种查询方式</span>&nbsp;&nbsp;&nbsp;&nbsp; 选择自 <a id="ArticleTitle1_ArticleTitle1_AuthorLink" href="http://dev.csdn.net/user/wangyihust">wangyihust</a> 的 Blog&nbsp;<br />
<span id="ArticleContent1_ArticleContent1_lblContent">&nbsp; </p>
<p><strong><font color="#ff0000">（一）HQL</font></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">HQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">：</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">Hibernate Qusery Language</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如果你已经熟悉它，就会发现它跟</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">SQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">非常相像。不过</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">你不要被表面的假象迷惑，</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">HQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">是面向对象的（</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">OO</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，用生命的眼光看待每一个对象，他们是如此</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">鲜活）。如果你对</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">JAVA</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">SQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句有一定了解的话，那么</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">HQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">对你简直易如反掌，你完全可以利用在公车上的时间掌握它。</span><span style="font-size: 10.5pt; color: #333333"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">以下从几个方面进行慢慢深入：</span><span style="font-size: 10.5pt; color: #333333"><br />
<br />
<font face="Times New Roman">1</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。大小些敏感</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">大家知道</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">SQL-92 Query</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">是对大小写不敏感的，但是在</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">HQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">（前面提到它是</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">OO</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的）中对对象类的名称和属性确实大小写敏感的（符合</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">java</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">编程语法）。</span>
<p style="margin: 0cm 0cm 0pt"><strong><em><span style="font-size: 10pt; color: blue; font-family: 黑体">HQL </span></em></strong><strong><em><span style="font-size: 10.5pt; color: blue; font-family: 黑体">子句本身大小写无关，但是其中出现的类名和属性名必须注意大小写区分</span></em></strong><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">如：</span><font face="Times New Roman"><span style="font-size: 10.5pt; color: blue">sElect</span><span style="font-size: 10.5pt; color: #333333"> cat.name from Cat as cat</span></font><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">和</span><font face="Times New Roman"><span style="font-size: 10.5pt; color: blue">select</span><span style="font-size: 10.5pt; color: #333333"> cat.name from Cat as cat</span></font><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">是一样的</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">但是：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">sElect </font></span><span style="font-size: 10.5pt"><font face="Times New Roman">cat.<span style="color: #333333">name from </span><span style="color: blue">CAT </span><span style="color: #333333">as cat</span></font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">和</span><font face="Times New Roman"><span style="font-size: 10.5pt; color: #333333">select cat.name from</span><span style="font-size: 10.5pt; color: blue"> Cat</span><span style="font-size: 10.5pt; color: #333333"> as cat</span></font><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">确实不一样的。</span><span style="font-size: 10.5pt; color: #333333"><br />
<br />
<font face="Times New Roman">2</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">from</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">最简单的：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">from eg.Cat <br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">它只是简单的返回所有</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">eg.Cat</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的实例</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">,</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">通常我们此时会为</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">eg.Cat</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">其个别名，因为在</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">query</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的其余部分可能会用到</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">(</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">参看上边关于大小写敏感时的例子情形</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">)</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如：</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: blue"><font face="Times New Roman">from eg.Cat as cat </font></span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">这里</span><span style="font-size: 10.5pt; color: blue"><font face="Times New Roman">as</font></span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">可以省略。</span>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">上边只是单表查询，多表的情况如下写法：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">from eg.Cat, eg.Dog<br />
from eg.Cat as cat, eg.Dog as dog<br />
<br />
3</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">join</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">相关</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">(inner) join<br />
left (outer) join<br />
right (outer) join<br />
full join<br />
HQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">同样对</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">SQL</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中的这些特性支持</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">下面插播一个小话题，关于上边的那些特性，我一直都没怎么用，今天既然说到这里，就想把上边的几个特性的用法说一下，也算对自己的一个补充：</span>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">假设有两个表：部门、员工，下面列举一些数据：</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">员工</span><span style="font-size: 10.5pt; color: blue"><font face="Times New Roman">(Employee)</font></span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">&nbsp;ID&nbsp;&nbsp;&nbsp;&nbsp; Name &nbsp;&nbsp;&nbsp;DepNo<br />
&nbsp;001 &nbsp;&nbsp;Jplateau&nbsp;&nbsp;&nbsp;01<br />
&nbsp;002 &nbsp;&nbsp;&nbsp;Jony&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;01<br />
&nbsp;003 &nbsp;&nbsp;Camel &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;02 </font></span>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: blue; font-family: 宋体">部门</span><span style="font-size: 10.5pt; color: blue"><font face="Times New Roman">(Department)</font></span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">&nbsp;ID&nbsp;&nbsp;Name<br />
&nbsp;01&nbsp;&nbsp; </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">&nbsp;02 &nbsp;&nbsp;</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">营销部</span><span style="font-size: 10.5pt; color: #333333"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">Hibernate</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中我们操纵的都是对象，所以我们操纵的是部门类和员工</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">1).(inner) join<br />
select employee.ID as id1,employee.Name as name1, </font></span>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">department.ID as id2,department.Name as name2 &nbsp;from Employee as employee </font></span>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">&nbsp;join &nbsp;Department as department on employee.DepNo=department.ID (</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">注意到条件语句我用</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">on </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">没有用</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">where)<br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">那么执行结果是什么呢？</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">id1 name1 id2 name2<br />
++++++++++++++++++++++++++++++++++++++<br />
001 Jplateau 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">002 Jony 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><br />
<br />
<font face="Times New Roman">2).left (outer) join<br />
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name<br />
as name2 from Employee as employee left join Department as department on employee.DepNo=<br />
department.ID <br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">那么执行结果又该是什么呢？</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">id1 name1 id2 name2<br />
++++++++++++++++++++++++++++++++++++++<br />
001 Jplateau 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">002 Jony 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman"> <br />
003 Camel null null <br />
{</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">就是说此时我要已第一个表的记录多少为准，第二个表中没有相应纪录的时候填充</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">null} <br />
3). right (outer) join<br />
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name<br />
as name2 from Employee as employee right join Department as department on employee.DepNo=<br />
department.ID <br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">那么执行结果又该是什么呢？</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">id1 name1 id2 name2<br />
++++++++++++++++++++++++++++++++++++++<br />
001 Jplateau 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">002 Jony 01 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">研发部</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman"> <br />
null null 02 </font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">营销部</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman"> <br />
{</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">就是说此时我要已第二个表的记录多少为准，第一个表中没有相应纪录的时候填充</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">null} <br />
<br />
4</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">select</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧：</span><span style="font-size: 10.5pt; color: #333333"><br />
<font face="Times New Roman">select employee form Employee as employee <br />
select employee form Employee as employee where employee.Name like 'J%'<br />
select employee.Name form Employee as employee where employee.Name like 'J%'<br />
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name<br />
as name2 from Employee as employee right join Department as department on employee.DepNo=<br />
department.ID <br />
<br />
select</font></span><span style="font-size: 10.5pt; color: blue"><font face="Times New Roman"> elements(</font></span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">employee.Name) from Employee as employee <br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">（不明白</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman">elements</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">到底是做什么用的？望给于说明）</span><span style="font-size: 10.5pt; color: #333333"><font face="Times New Roman"> <br />
</font></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">等等</span> <span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">
<p><br />
5<span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。数学函数</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
JDO</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">目前好像还不支持此类特性。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
avg(...), sum(...), min(...), max(...) <br />
<br />
count(*) <br />
<br />
count(...), count(distinct ...), count(all...) <br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">其用法和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">基本相同</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
select distinct employee.name from Employee as employee <br />
select count(distinct employee.name),count(employee) from Employee as employee <br />
<br />
6</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">polymorphism (</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">暂时不知道如何解释？</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">)<br />
from com.test.Animal as animal<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">不光得到所有</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Animal</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">得实例，而且可以得到所有</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Animal</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的子类（如果我们定义了一个子类</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Cat</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">）</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">一个比较极端的例子</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
from java.lang.Object as o<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">可以得到所有持久类的实例</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
7</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">where</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">定义查询语句的条件，举几个例子吧：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
from Employee as employee where employee.Name='Jplateau'<br />
from Employee as employee where employee.Name like 'J%'<br />
from Employee as employee where employee.Name like '%u'<br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">where</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">语句中&#8220;</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">=</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">&#8221;不光可以比较对象的属性，也可以比较对象</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
select animal from com.test.Animal as animal where animal.name=dog<br />
<br />
8</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。表达式</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句中大部分的表达式在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">HQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中都可以使用：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
mathematical operators +, -, *, / <br />
<br />
binary comparison operators =, &gt;=, &lt;=, &lt;&gt;, !=, like <br />
<br />
logical operations and, or, not <br />
<br />
string concatenation || <br />
<br />
SQL scalar functions like upper() and lower() <br />
<br />
Parentheses ( ) indicate grouping <br />
<br />
in, between, is null <br />
<br />
JDBC IN parameters ? <br />
<br />
named parameters :name, :start_date, :x1 </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">（这种应该是另一种</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">"?"</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的变通解决方法）</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
SQL literals 'foo', 69, '1970-01-01 10:00:01.0' <br />
<br />
Java public static final constants eg.Color.TABBY <br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">其他不必解释了，在这里我只想对查询中的参数问题说明一下：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">大家知道在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">中进行传递参数进行查询的时候，我们通常用</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">PreparedStatement</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">，在语句中写一大堆的&#8220;？&#8221;，</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">hql</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">中也可以用这种方法</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
List mates = sess.find(<br />
"select employee.name from Employee as employee " +<br />
"where employee.Name=? ",<br />
name,<br />
Hibernate.STRING<br />
);<br />
(</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">说明：上面利用</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Session</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">里的</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">api Session</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中重载了很多</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，它可以满足你多种形式的查询</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">)<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">上边是一个参数的情形，这种情况下紧接着引入参数和定义参数的类型，当为多个参数，调用另一个</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，它的后两个</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">参数都是数组的形式。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">还有另外一种方法来解决上边的问题，</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">JDO</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">也有这样的方法，不过和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的表现形式上有差别，但他们两个骨子里却是</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">一样的，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");<br />
q.setString("name", "Jplateau");<br />
//</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">当有多个参数的时候在此逐一定义</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
Iterator employees = q.iterate(); <br />
<br />
9</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">order </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">sql</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句没什么差别，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">或者</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">asc)<br />
<br />
10</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">group by </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">同样和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">sql</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句没什么差别，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
select employee.name,employee.DepNo from Employee as employee group by employee.DepNo<br />
<br />
select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id<br />
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">谁帮我解释一下上边两句，谢过！</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
11</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。子查询</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">同样支持子查询，写几个例子：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
from eg.Cat as fatcat where fatcat.weight &gt; ( select avg(cat.weight) from eg.DomesticCat cat )<br />
<br />
<font color="#ff0000">（二）条件查询Criteria&nbsp; Query</font></span></p>
<p></span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。数学函数</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
JDO</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">目前好像还不支持此类特性。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
avg(...), sum(...), min(...), max(...) <br />
<br />
count(*) <br />
<br />
count(...), count(distinct ...), count(all...) <br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">其用法和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">基本相同</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
select distinct employee.name from Employee as employee <br />
select count(distinct employee.name),count(employee) from Employee as employee <br />
<br />
6</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">polymorphism (</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">暂时不知道如何解释？</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">)<br />
from com.test.Animal as animal<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">不光得到所有</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Animal</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">得实例，而且可以得到所有</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Animal</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的子类（如果我们定义了一个子类</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Cat</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">）</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">一个比较极端的例子</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
from java.lang.Object as o<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">可以得到所有持久类的实例</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
7</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">where</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">定义查询语句的条件，举几个例子吧：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
from Employee as employee where employee.Name='Jplateau'<br />
from Employee as employee where employee.Name like 'J%'<br />
from Employee as employee where employee.Name like '%u'<br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">where</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">语句中&#8220;</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">=</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">&#8221;不光可以比较对象的属性，也可以比较对象</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
select animal from com.test.Animal as animal where animal.name=dog<br />
<br />
8</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。表达式</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句中大部分的表达式在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">HQL</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中都可以使用：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
mathematical operators +, -, *, / <br />
<br />
binary comparison operators =, &gt;=, &lt;=, &lt;&gt;, !=, like <br />
<br />
logical operations and, or, not <br />
<br />
string concatenation || <br />
<br />
SQL scalar functions like upper() and lower() <br />
<br />
Parentheses ( ) indicate grouping <br />
<br />
in, between, is null <br />
<br />
JDBC IN parameters ? <br />
<br />
named parameters :name, :start_date, :x1 </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">（这种应该是另一种</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">"?"</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的变通解决方法）</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
SQL literals 'foo', 69, '1970-01-01 10:00:01.0' <br />
<br />
Java public static final constants eg.Color.TABBY <br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">其他不必解释了，在这里我只想对查询中的参数问题说明一下：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">大家知道在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">SQL</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">中进行传递参数进行查询的时候，我们通常用</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">PreparedStatement</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">，在语句中写一大堆的&#8220;？&#8221;，</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">在</span><span style="font-size: 10.5pt; color: blue; font-family: 'Times New Roman'">hql</span><span style="font-size: 10.5pt; color: blue; font-family: 宋体">中也可以用这种方法</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
List mates = sess.find(<br />
"select employee.name from Employee as employee " +<br />
"where employee.Name=? ",<br />
name,<br />
Hibernate.STRING<br />
);<br />
(</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">说明：上面利用</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">Session</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">里的</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，在</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">api Session</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">中重载了很多</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，它可以满足你多种形式的查询</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">)<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">上边是一个参数的情形，这种情况下紧接着引入参数和定义参数的类型，当为多个参数，调用另一个</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">find</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">方法，它的后两个</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">参数都是数组的形式。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">还有另外一种方法来解决上边的问题，</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">JDO</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">也有这样的方法，不过和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">的表现形式上有差别，但他们两个骨子里却是</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">一样的，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");<br />
q.setString("name", "Jplateau");<br />
//</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">当有多个参数的时候在此逐一定义</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
Iterator employees = q.iterate(); <br />
<br />
9</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">order </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">sql</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句没什么差别，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">或者</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">asc)<br />
<br />
10</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">group by </span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">同样和</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">sql</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">语句没什么差别，如：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
select employee.name,employee.DepNo from Employee as employee group by employee.DepNo<br />
<br />
select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id<br />
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}<br />
</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">谁帮我解释一下上边两句，谢过！</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
11</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">。子查询</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
hibernate</span><span style="font-size: 10.5pt; color: #333333; font-family: 宋体">同样支持子查询，写几个例子：</span><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><br />
<br />
from eg.Cat as fatcat where fatcat.weight &gt; ( select avg(cat.weight) from eg.DomesticCat cat )<br />
<br />
<font color="#ff0000">（二）条件查询Criteria&nbsp; Query</font></span> </p>
<p><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'">&nbsp;Criteria criteria = osession.createCriteria(Owner.class);<br />
&nbsp;&nbsp;&nbsp;criteria.add(Expression.eq("age", new Integer(100)));<br />
&nbsp;&nbsp;&nbsp;criteria.setFirstResult(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从返回结果的第二条记录开始的5条记录<br />
&nbsp;&nbsp;&nbsp;criteria.setMaxResults(5);<br />
&nbsp;&nbsp;&nbsp;List lc=criteria.list();<br />
&nbsp;&nbsp;&nbsp;System.out.println("条件查询");<br />
&nbsp;&nbsp;&nbsp;System.out.println(lc.size());</span></p>
<p><span style="font-size: 10.5pt; color: #333333; font-family: 'Times New Roman'"><font color="#ff0000">（三）原生SQL语句查询</font></span></p>
</span>
<img src ="http://www.blogjava.net/zilong/aggbug/191937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zilong/" target="_blank">阿伟</a> 2008-04-10 17:41 <a href="http://www.blogjava.net/zilong/archive/2008/04/10/191937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>