`
awaitdeng
  • 浏览: 216539 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate查询语句--HQL

阅读更多

Hibernate查询语句--HQL

 
1、from

1.1单表查询
from eg.cat as cat.其中,cat只是一个别名,为了用其他子语句的时候书写简单。

1.2多表查询

from eg.Cat,eg.Dog from eg.Cat as cat,eg.Dog as dog


2、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}

3、大小写敏感

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到底是做什么用的?望给于说明)等等

#p#

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,1 (这种应该是另一种"?"的变通解决方法)
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 )



分享到:
评论

相关推荐

    hibernate查询语句--HQL

    ### Hibernate 查询语句 -- HQL #### 概述 Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而简化了数据访问逻辑。在 Hibernate 中,执行查询操作的主要...

    hibernate-HQL语句大全

    hibernate-HQL语句大全

    Hibernate-HQL-查询-Query资料

    在Hibernate中,HQL(Hibernate Query Language)是专为ORM设计的一种面向对象的查询语言,它允许开发者以类和对象的方式进行数据查询,而不是直接使用SQL。本资料主要涵盖了Hibernate HQL查询的基本概念、语法以及...

    hibernate查询语言--HQL

    Hibernate 查询语言 HQL(Hibernate Query Language)是Hibernate框架提供的一种面向对象的查询语言,它是对SQL的封装,使得开发者可以使用面向对象的方式来处理数据库查询,避免了直接操作SQL带来的复杂性和对象与...

    hibernate-core-5.0.11.Final.jar

    Hibernate Core是Hibernate框架的基础部分,它包含了ORM的核心功能,如实体管理、事务处理、查询语言(HQL)等。`5.0.11.Final`版本是一个稳定且广泛使用的版本,提供了诸多改进和优化。 二、源码结构解析 `...

    hibernate-hql-lucene-1.0.1.Final.zip

    【标题】"hibernate-hql-lucene-1.0.1.Final.zip" 提供的是一个关于Hibernate HQL与Lucene集成的开源项目版本,主要用于在Java应用程序中实现高效、复杂的全文搜索功能。 【描述】"pact-jvm.zip,pact模型" 指的是...

    hibernate-release-5.0.0.Final(1).zip

    3. Query:提供HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)来执行数据库查询,也可以通过Criteria API构建动态查询。 4. Transaction:Hibernate支持事务管理,确保数据的一致性和...

    hibernate-release-4.2.4.Final.zip

    8. **HQL(Hibernate Query Language)**: Hibernate 提供了自己的查询语言HQL,它是面向对象的,与SQL类似但更接近Java,可以方便地进行对象级别的查询,避免直接写SQL带来的麻烦。 9. **事务管理**:Hibernate...

    hibernate-release-5.3.2.Final

    2. Criteria API:提供了一种比HQL更面向对象的查询方式,可以动态构建查询条件,避免硬编码SQL语句。 3. CriteriaBuilder:用于构建Criteria查询,提供了强大的查询构建工具,支持复杂的查询逻辑。 4. Query和Named...

    hibernate源码release-4.1.4.Final版

    3. Query与Criteria:提供了两种查询方式,HQL(Hibernate Query Language)是一种面向对象的查询语言,类似于SQL;Criteria API则提供了更动态、更面向对象的查询方式。 三、实体管理 Hibernate通过@Entity注解...

    hibernate-distribution-3.6.0

    HQL使得开发者可以脱离具体的数据库方言,写出可移植性强的查询语句。 4. ** Criteria API**:为那些不喜欢HQL或者需要更动态查询的开发者提供了另一种选择。Criteria API允许在运行时构建查询,提供了一种更加面向...

    Hibernate-HQL语句多对多写法

    在这种情况下,我们需要使用 Hibernate 的 HQL 语言来编写查询语句,以便检索和操作数据。 在这个例子中,我们有三个实体类:Menu、Privilege 和中间表 menu_privilege。Menu 实体类中有一个 privileges 列表字段,...

    hibernate-annotations-3.4.0.GA and hibernate-entitymanager-3.4.0.GA

    - HQL(Hibernate Query Language):类似于SQL,专门用于查询Hibernate实体的语句。 - QBC(Query By Criteria):基于Java对象的查询方式,提供构建查询条件的API。 通过以上讲解,我们可以看出`hibernate-...

    hibernate-distribution-3.5.0-Final-dist文档

    5. **Criteria查询**: 除了传统的HQL(Hibernate查询语言),Hibernate还提供了Criteria API,一种更面向对象的查询方式,允许动态构建查询条件。 6. **第二级缓存**: Hibernate支持二级缓存,可以提高数据读取速度...

    hibernate-orm-master.zip

    4. **查询语言**:Hibernate Query Language (HQL) 是一种面向对象的查询语言,类似于SQL,但操作的是对象和属性。此外,Criteria API提供了一种更面向对象的方式来构建查询,避免硬编码SQL,增强代码的可读性。 5....

    hibernate-release-4.2.12.Final libs

    - 查询优化:使用HQL或Criteria API编写查询语句,可避免SQL注入,同时支持复杂的关联查询。 - 缓存机制:通过集成Ehcache等缓存库,提高数据访问效率,减少数据库负载。 - 事务管理:Hibernate支持JTA和JDBC事务...

    hibernate-release-5.0.11.Final

    1. 数据库操作:Hibernate支持CRUD(创建、读取、更新、删除)操作,通过Criteria、HQL(Hibernate查询语言)和SQL,灵活处理复杂的查询需求。 2. 支持多种数据库:Hibernate可与MySQL、Oracle、PostgreSQL等多种...

    经典hibernate教程-HQL语句

    HQL的全称是?...HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria查询对象?

    hibernate-distribution-3.6.0.Final-dist

    3. **查询语言**:Hibernate支持HQL(Hibernate Query Language),一种类似SQL的语言,但针对对象而非表格。此外,还提供了 Criteria 查询和JPQL(Java Persistence Query Language)。 4. **缓存机制**:...

Global site tag (gtag.js) - Google Analytics