`

HQL的嵌套子查询

    博客分类:
  • hql
 
阅读更多
HQL不支持from的子查询

一:嵌套子查询的概念:
在SQL中,一个select-from-where语句成为一个查询块。将一个查询块嵌套在另一个查询块的where子句
或having短语的条件中,这样的查询称为嵌套查询或者子查询。如:
from Student s
where s.sno in
     (select sno from sc where cno='1')
上面的HQL语句在Hibernate后台生成的SQL语句为:
    select
           student0_.id as id1_,
           student0_.Sno as Sno1_,
           student0_.Sname as Sname1_,
          student0_.Ssex as Ssex1_,
          student0_.Sdept as Sdept1_,
          student0_.Sage as Sage1_,
          student0_.Saddress as Saddress1_
    from
        joblog.student student0_
    where
        student0_.Sno in (
              select
                   sc1_.Sno
              from
                   joblog.sc sc1_
              where
                   sc1_.Cno='1'
        )
在这个例子中,下层查询块select sno from sc where cno='1'是嵌套在上层查询块
from Student s where s.sno in的where条件中的。上层查询块又称为外层查询或父查询,
下层查询块称为内层查询或者子查询。
嵌套查询的求解方法由里向外处理,每一个子查询在其上一级查询处理之前查询,
子查询的结果用于建立父查询的查询条件。
二:带有IN谓词的子查询:
带有IN谓词的子查询指的是父查询与子查询用谓词IN连接,判断某个属性列值是否在子查询的结果中。
在嵌套查询中,子查询的结果往往是一个集合。
例如,查询与“张三”在同一个系学习的学生。可以使用如下的方法进行:先查询“张三”所在系,
然后查询在这个系里的所有学生。先查询的作为条件是子查询,后查询的是父查询。具体代码如下。
from Student s
where s.sdept in
(select s.sdept from s where s.sname='张三)
三:比较子查询:
如果确切知道子查询返回的是单值,可以用=、>、>=、<、<=、<>比较运算符进行比较子查询。
例:查询与“张三”在同一个系学习的学生。
这个例子与上面的例子一样。“张三”只可能在一个系学习,所以子查询返回单值,可以用比较子查询。
from Student s
where s.sdept=
(select s.sdept from s where s.sname='张三')
四: 带有ANY或ALL的子查询:
使用ANY或者ALL谓词时,必须同时使用比较运算符。查询其他系中比计算机系任一学生年龄小的学生名单。
from Student s
where s.sage<ANY(select s.sage from s where s.sdept='计算机系')
and s.sdept<>'计算机系'
     子查询查询出计算机系学生的所有年龄,然后用“<ANY”关键字进行年龄比较。
     and后的条件s.sdept<>‘计算机系’是父查询的条件。
带有ANY或ALL的子查询的谓词如下所述。
>ANY,大于子查询结果中的某个值。
<ANY,小于子查询中的某个值。
>=ANY,大于等于子查询中的某个值。
<=ANY,小于等于子查询中的某个值。
=ANY,等于子查询中的某个值。
!=ANY或者<>ANY,不等于子查询中的某个值。
>ALL,大于子查询中的所有值。
<ALL,小于子查询中的所有值。
>=ALL,大于等于子查询中的所有值。
<=ALL,小于等于子查询中的所有值。
=ALL,等于子查询中的所有值。
!=ALL或者<>ALL,不等于子查询中的任何一个值。
此处记录一条HQL语句:
from OuterFilesBasic as o inner join fetch o.outerCosts as c where c.costcol='0' and c.endtime =to_date('2011-01-02','yyyy-MM-dd') and o.id in(select filesBasic from  OuterZcsb as z where z.declevel like '%初级%')


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics