Hibernate查询语言:HQL

原创 2003年08月11日 11:32:00

Hibernate查询语言:HQL


    HQL:Hibernate Qusery Language,如果你已经熟悉它,就会发现它跟SQL非常相像。不过 你不要被表面的假象迷惑,HQL是面向对象的(OO,用生命的眼光看待每一个对象,他们是如此 鲜活)。如果你对JAVA和SQL语句有一定了解的话,那么HQL对你简直易如反掌,你完全可以利用在公车上的时间掌握它。
   
         以下从几个方面进行慢慢深入:
        
         1。大小些敏感
         大家知道Query是对大小写不敏感的,但是在HQL(前面提到它是OO的)中那么对象类的名称和属性确实大小写敏感的(符合java编程语法)。
       如:sElect cat.name from Cat as cat和select cat.name from Cat as cat是一样的
       但是:
           sElect cat.name from CAT as cat和select cat.name from Cat as cat确实不一样的。
          
       2。from语句
       最简单的:
        from eg.Cat
        它只是简单的返回所有eg.Cat的实例
        通常我们此时会为eg.Cat其个别名,因为在query的其余部分可能会用到(参看上边关于大小写
        敏感时的例子情形),如:
        from eg.Cat as cat 这里as可以省略。
        上边只是单表查询,多表的情况如下写法:
        from eg.Cat,eg.Dog
        from eg.Cat as cat,eg.Dog as dog
       
        3。join相关
        (inner) join
        left (outer) join
        right (outer) join
        full join
        HQL同样对SQL中的这些特性支持
         下面插播一个小话题,关于上边的那些特性,我一直都没怎么用,今天既然说到这里,就想
        把上边的几个特性的用法说一下,也算对自己的一个补充:
         假设有两个表:部门、员工,下面列举一些数据:
         员工(Employee):
         ID      Name    DepNo
         001     Jplateau  01
         002     Jony      01
         003     Camel    02
         部门(Department):
         ID      Name
         01     研发部
         02     营销部
         
         在Hibernate中我们操纵的都是对象,所以我们操纵的是部门类和员工类
         1).(inner) join
         select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
          as name2 from Employee as employee join Department as department on employee.DepNo=
          department.ID  (注意到条件语句我用on 没有用where)
         那么执行结果是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研发部
         002 Jony     01 研发部
         
         2).left (outer) join
         select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
          as name2 from Employee as employee left join Department as department on employee.DepNo=
          department.ID
         那么执行结果又该是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研发部
         002 Jony     01 研发部
         003 Camel    null null  
         {就是说此时我要已第一个表的记录多少为准,第二个表中没有相应纪录的时候填充null}  
         3).  right (outer) join
         select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
          as name2 from Employee as employee right join Department as department on employee.DepNo=
          department.ID
         那么执行结果又该是什么呢?
         id1 name1 id2 name2
         ++++++++++++++++++++++++++++++++++++++
         001 Jplateau 01 研发部
         002 Jony     01 研发部
         null null     02 营销部  
         {就是说此时我要已第二个表的记录多少为准,第一个表中没有相应纪录的时候填充null} 
         
        4。select语句
           就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:
           select employee form Employee as employee
           select employee form Employee as employee where employee.Name like 'J%'
           select employee.Name form Employee as employee where employee.Name like 'J%'
           select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
          as name2 from Employee as employee right join Department as department on employee.DepNo=
          department.ID
         
           select elements(employee.Name) from Employee as employee
           (不明白elements到底是做什么用的?望给于说明)
          
           等等
        5。数学函数
           JDO目前好像还不支持此类特性。
           avg(...), sum(...), min(...), max(...)

            count(*)

     count(...), count(distinct ...), count(all...)
    
     其用法和SQL基本相同
    
     select distinct employee.name from Employee as employee
     select count(distinct employee.name),count(employee) from Employee as employee
    
   6。polymorphism (暂时不知道如何解释?)
     from com.test.Animal as animal
     不光得到所有Animal得实例,而且可以得到所有Animal的子类(如果我们定义了一个子类Cat)
     一个比较极端的例子
     from java.lang.Object as o
     可以得到所有持久类的实例
    
   7。where语句
     定义查询语句的条件,举几个例子吧:
     from Employee as employee where employee.Name='Jplateau'
     from Employee as employee where employee.Name like 'J%'
     from Employee as employee where employee.Name like '%u'
     在where语句中“=”不光可以比较对象的属性,也可以比较对象,如:
     select animal from com.test.Animal as animal  where animal.name=dog
    
    8。表达式
   
    在SQL语句中大部分的表达式在HQL中都可以使用:
    mathematical operators +, -, *, /

           binary comparison operators =, >=, <=, <>, !=, like

           logical operations and, or, not

           string concatenation ||

           SQL scalar functions like upper() and lower()
          
           Parentheses ( ) indicate grouping

           in, between, is null

           JDBC IN parameters ?

           named parameters :name, :start_date, :x1 (这种应该是另一种"?"的变通解决方法)

           SQL literals 'foo', 69, '1970-01-01 10:00:01.0'

           Java public static final constants eg.Color.TABBY
          
           其他不必解释了,在这里我只想对查询中的参数问题说明一下:
           大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatement,在语句中写一大堆的“?”,
           在hql中也可以用这种方法,如:
           List mates = sess.find(
                    "select employee.name from Employee as employee " +
                    "where employee.Name=? ",
                    name,
                    Hibernate.STRING
                   );
           (说明:上面利用Session里的find方法,在hibernate的api Session中重载了很多find方法,它可以满足你多种形式的查询)
           上边是一个参数的情形,这种情况下紧接着引入参数和定义参数的类型,当为多个参数,调用另一个find方法,它的后两个
           参数都是数组的形式。
          
           还有另外一种方法来解决上边的问题,JDO也有这样的方法,不过和hibernate的表现形式上有差别,但他们两个骨子里却是
           一样的,如:
           Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
           q.setString("name", "Jplateau");
           //当有多个参数的时候在此逐一定义
           Iterator employees = q.iterate();  
          
           9。order 语句
           和sql语句没什么差别,如:
           select employee.name from Employee as employee where employee.Name like 'J%'  order by employee.ID desc (或者asc)
          
           10。group by 语句
           同样和sql语句没什么差别,如:
          
           select employee.name,employee.DepNo from Employee as employee group by employee.DepNo
          
           select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
           {Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
           谁帮我解释一下上边两句,谢过!

          
           11。子查询
           hibernate同样支持子查询,写几个例子:
          
           from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )
          
   小节:
   其实HQL和SQL是非常相似的,在写的时候你只要时刻想到对象的概念,那么你完全可以用SQL的思想来写HQL.
  
   参考资源:Hibernate参考手册第七章以及第九章,建议由时间的并且要用hibernate开发项目的朋友仔细研读该手册。 

   昨天看了《海底总动员》  ,不知道中国的动画片何时能“站”起来?
          

     

hibernate的HQL查询语言总结

HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实...
  • tuke_tuke
  • tuke_tuke
  • 2015年11月11日 12:41
  • 2265

hibernate中HQL查询语句

参考https://www.oschina.net/code/snippet_1051545_36896 我的查询示例 参考我的项目示例: // 根据HQl语句查询 @Overri...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016年11月19日 12:37
  • 2358

Hibernate查询语言(HQL)

概述HQL语法类似于SQL,但是HQL是一种完全面向对象的语言,能够直接查询对象和其属性语法也是select…from..。结构, select后面可以跟实体对象,实体对象的属性或其他值, fro...
  • u011383131
  • u011383131
  • 2016年04月15日 15:22
  • 219

(HQL)hibernate查询语言

HQL实例:1. 查询表中的所有记录:from Category2. 带有where子句的条件查询:from Category c where c.name > 'c5'3. 结果根据某一字段排序:f...
  • wkcgy
  • wkcgy
  • 2011年04月22日 20:37
  • 670

HQL:Hibernate查询语言(四)

15.9. order by子句 查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:  代码内容from DomesticCat c...
  • gln
  • gln
  • 2005年12月12日 15:01
  • 1888

HQL:Hibernate查询语言(三)

15.8. 表达式 在where子句中允许使用的表达式包括 大多数你可以在SQL使用的表达式种类:  数学运算符+, -, *, /  二进制比较运算符=, >=, , !=, like  逻辑运算符...
  • gln
  • gln
  • 2005年12月05日 14:17
  • 1879

Hibernate 查询语言(HQL)

本文翻译自Hibernate的文档第10章《Hibernate Query Language》。        Hibernate拥有一种功能非常强大的查询语言,这种语言被有意得与SQL非常相似,便于...
  • yuanli
  • yuanli
  • 2004年09月09日 21:10
  • 1936

hibernate的HQL查询语言

本文讲解Hibernate常用的HQL查询语言。 1、简述 HQL语言(Hibernate Query Language)类似于SQL语言,有SQL语言很多关键字,如select、from、where...
  • yxtouch
  • yxtouch
  • 2015年10月12日 23:17
  • 477

Hibernate 3.x——HQL查询语言

Hibernate  3.x——HQL查询语言   示例:Hibernate3_10_HQL Hibernate查询:     数据查询与检索是Hibernate中的一个亮点。相对其他ORM实...
  • zhourrr1234
  • zhourrr1234
  • 2012年02月26日 19:53
  • 1760

Hibernate查询语言-HQL

Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。...
  • lhtzbj12
  • lhtzbj12
  • 2016年01月19日 21:09
  • 514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate查询语言:HQL
举报原因:
原因补充:

(最多只允许输入30个字)