﻿<?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-ALL  ABOUT JAVA-随笔分类-Hibernate,Ibatis 持久层</title><link>http://www.blogjava.net/wdlfellow/category/21231.html</link><description>JAVA 技术</description><language>zh-cn</language><lastBuildDate>Wed, 25 Apr 2007 05:25:57 GMT</lastBuildDate><pubDate>Wed, 25 Apr 2007 05:25:57 GMT</pubDate><ttl>60</ttl><item><title>HQL查询语言基础</title><link>http://www.blogjava.net/wdlfellow/archive/2007/04/25/113497.html</link><dc:creator>泡面</dc:creator><author>泡面</author><pubDate>Wed, 25 Apr 2007 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/wdlfellow/archive/2007/04/25/113497.html</guid><wfw:comment>http://www.blogjava.net/wdlfellow/comments/113497.html</wfw:comment><comments>http://www.blogjava.net/wdlfellow/archive/2007/04/25/113497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wdlfellow/comments/commentRss/113497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wdlfellow/services/trackbacks/113497.html</trackback:ping><description><![CDATA[<div class=con_all>
<p>1 .from<br><br>1.1单表查询<br><br>from eg.cat as cat.其中，cat只是一个别名，为了用其他子语句的时候书写简单<br><br>1.2多表查询<br><br>from eg.Cat,eg.Dog<br>from eg.Cat as cat,eg.Dog as dog<br>2 join相关<br>(inner) join<br>left (outer) join<br>right (outer) join<br>full join<br>HQL同样对SQL中的这些特性支持<br>下面插播一个小话题，关于上边的那些特性，我一直都没怎么用，今天既然说到这里，就想<br>把上边的几个特性的用法说一下，也算对自己的一个补充：<br>假设有两个表：部门、员工，下面列举一些数据：<br>员工(Employee)：<br>ID Name DepNo<br>001 Jplateau 01<br>002 Jony 01<br>003 Camel 02<br>部门(Department)：<br>ID Name<br>01 研发部<br>02 营销部<br><br>在Hibernate中我们操纵的都是对象，所以我们操纵的是部门类和员工类<br>1).(inner) join<br>select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name<br>as name2 from Employee as employee join Department as department on employee.DepNo=<br>department.ID (注意到条件语句我用on 没有用where)<br>那么执行结果是什么呢？<br>id1 name1 id2 name2<br>++++++++++++++++++++++++++++++++++++++<br>001 Jplateau 01 研发部<br>002 Jony 01 研发部<br><br>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>那么执行结果又该是什么呢？<br>id1 name1 id2 name2<br>++++++++++++++++++++++++++++++++++++++<br>001 Jplateau 01 研发部<br>002 Jony 01 研发部 <br>003 Camel null null <br>{就是说此时我要已第一个表的记录多少为准，第二个表中没有相应纪录的时候填充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>那么执行结果又该是什么呢？<br>id1 name1 id2 name2<br>++++++++++++++++++++++++++++++++++++++<br>001 Jplateau 01 研发部<br>002 Jony 01 研发部 <br>null null 02 营销部 <br>{就是说此时我要已第二个表的记录多少为准，第一个表中没有相应纪录的时候填充null} <br><br>3 大小写敏感<br><br>4。select语句<br>就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧：<br>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 elements(employee.Name) from Employee as employee <br>（不明白elements到底是做什么用的？望给于说明） <br>等等<br>5。数学函数<br>JDO目前好像还不支持此类特性。<br>avg(...), sum(...), min(...), max(...) <br><br>count(*) <br><br>count(...), count(distinct ...), count(all...) <br><br>其用法和SQL基本相同<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。polymorphism (暂时不知道如何解释？)<br>from com.test.Animal as animal<br>不光得到所有Animal得实例，而且可以得到所有Animal的子类（如果我们定义了一个子类Cat）<br>一个比较极端的例子<br>from java.lang.Object as o<br>可以得到所有持久类的实例<br><br>7。where语句<br>定义查询语句的条件，举几个例子吧：<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>在where语句中&#8220;=&#8221;不光可以比较对象的属性，也可以比较对象，如：<br>select animal from com.test.Animal as animal where animal.name=dog<br><br>8。表达式<br><br>在SQL语句中大部分的表达式在HQL中都可以使用：<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 （这种应该是另一种"?"的变通解决方法）<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>其他不必解释了，在这里我只想对查询中的参数问题说明一下：<br>大家知道在SQL中进行传递参数进行查询的时候，我们通常用PreparedStatement，在语句中写一大堆的&#8220;？&#8221;，<br>在hql中也可以用这种方法，如：<br>List mates = sess.find(<br>"select employee.name from Employee as employee " +<br>"where employee.Name=? ",<br>name,<br>Hibernate.STRING<br>);<br>(说明：上面利用Session里的find方法，在hibernate的api Session中重载了很多find方法，它可以满足你多种形式的查询)<br>上边是一个参数的情形，这种情况下紧接着引入参数和定义参数的类型，当为多个参数，调用另一个find方法，它的后两个<br>参数都是数组的形式。<br><br>还有另外一种方法来解决上边的问题，JDO也有这样的方法，不过和hibernate的表现形式上有差别，但他们两个骨子里却是<br>一样的，如：<br>Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");<br>q.setString("name", "Jplateau");<br>//当有多个参数的时候在此逐一定义<br>Iterator employees = q.iterate(); <br><br>9。order 语句<br>和sql语句没什么差别，如：<br>select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)<br><br>10。group by 语句<br>同样和sql语句没什么差别，如：<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>谁帮我解释一下上边两句，谢过！<br><br>11。子查询<br>hibernate同样支持子查询，写几个例子：<br><br>from eg.Cat as fatcat where fatcat.weight &gt; ( select avg(cat.weight) from eg.DomesticCat cat )<br></p>
</div>
<img src ="http://www.blogjava.net/wdlfellow/aggbug/113497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wdlfellow/" target="_blank">泡面</a> 2007-04-25 13:21 <a href="http://www.blogjava.net/wdlfellow/archive/2007/04/25/113497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>