`
conkeyn
  • 浏览: 1525091 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Join用法,HQL的方法,Hibernate中的fetch

阅读更多

Join用法:

主要有Inner Join 及 Outer Join:


最常用的(默认是Inner):

Select <要选择的字段> From <主要资料表>

  <Join 方式> <次要资料表> [On <Join 规则>]

Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉


Outer Join:

Select <要查询的字段> From <Left 资料表>

  <Left | Right> [Outer] Join <Right 资料表> On <Join 规则>


语 法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料


另外,还有全外联:

FULL JOIN 或 FULL OUTER JOIN


完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。


以及,

交叉联接

交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。

没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。也就是说在没有 WHERE 子句的情况下,若表 A 有 3 行记录,表 B 有 6 行记录 : :

SELECT A.*,B.* FROM 表A CROSS JOIN 表B

那以上语句会返回 18 行记录。



Fetch:

在我们查询Parent对象的时候,默认只有Parent的内容,并不包含childs的信息,如果在Parent.hbm.xml里设置lazy="false"的话才同时取出关联的所有childs内容.
问题是我既想要hibernate默认的性能又想要临时的灵活性该怎么办?  这就是fetch的功能。我们可以把fetch与lazy="true"的关系类比为事务当中的编程式事务与声明式事务,不太准确,但是大概是这个意思。
总值,fetch就是在代码这一层给你一个主动抓取得机会.

Parent parent = (Parent)hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query q = session.createQuery(
"from Parent as parent "+
" left outer join fetch parent.childs " +
" where parent.id = :id"
                );
                q.setParameter("id",new Long(15));
return (Parent)q.uniqueResult();
            }
        });
        Assert.assertTrue(parent.getChilds().size() > 0);

你可以在lazy="true"的情况下把fetch去掉,就会报异常. 当然,如果lazy="false"就不需要fetch了



HQL一些特色方法:

in and between may be used as follows:

from DomesticCat cat where cat.name between 'A' and 'B'
from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )

and the negated forms may be written

from DomesticCat cat where cat.name not between 'A' and 'B'
from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )

Likewise, is null and is not null may be used to test for null values.

Booleans may be easily used in expressions by declaring HQL query substitutions in Hibernate configuration:

<property name="hibernate.query.substitutions">true 1, false 0</property>

This will replace the keywords true and false with the literals 1 and 0 in the translated SQL from this HQL:

from Cat cat where cat.alive = true

You may test the size of a collection with the special property size , or the special size() function.

from Cat cat where cat.kittens.size > 0
from Cat cat where size(cat.kittens) > 0

For indexed collections, you may refer to the minimum and maximum indices using minindex and maxindex minelement and maxelement functions. functions. Similarly, you may refer to the minimum and maximum elements of a collection of basic type using the

from Calendar cal where maxelement(cal.holidays) > current_date
from Order order where maxindex(order.items) > 100
from Order order where minelement(order.items) > 10000

The SQL functions any, some, all, exists, in are supported when passed the element or index set of a collection (elements and indices functions) or the result of a subquery (see below).

select mother from Cat as mother, Cat as kit
where kit in elements(foo.kittens)
select p from NameList list, Person p
where p.name = some elements(list.names)
from Cat cat where exists elements(cat.kittens)
from Player p where 3 > all elements(p.scores)
from Show show where 'fizard' in indices(show.acts)

Note that these constructs - size , elements , indices , minindex , maxindex , minelement , maxelement - may only be used in the where clause in Hibernate3.

Elements of indexed collections (arrays, lists, maps) may be referred to by index (in a where clause only):

from Order order where order.items[0].id = 1234
select person from Person person, Calendar calendar
where calendar.holidays['national day'] = person.birthDay
    and person.nationality.calendar = calendar
select item from Item item, Order order
where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11
select item from Item item, Order order
where order.items[ maxindex(order.items) ] = item and order.id = 11

The expression inside [] may even be an arithmetic expression.

select item from Item item, Order order
where order.items[ size(order.items) - 1 ] = item

HQL also provides the built-in index() function, for elements of a one-to-many association or collection of values.

select item, index(item) from Order order 
    join order.items item
where index(item) < 5

Scalar SQL functions supported by the underlying database may be used

from DomesticCat cat where upper(cat.name) like 'FRI%'


分享到:
评论

相关推荐

    Hibernate Fetch 的作用

    在Hibernate查询语言(HQL)或原生SQL查询中,可以使用`Fetch`关键字来显式指定关联对象的加载。例如,在上面的代码片段中,通过`left outer join fetch parent.childs`语句,我们告诉Hibernate在加载`Parent`实体时...

    HQL Hibernate查询语言

    此外,还有一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的...

    Hibernate注解方式、HQL查询

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细探讨Hibernate的注解方式以及HQL(Hibernate Query Language)查询...

    Hibernate_HQL大全

    5. **FETCH JOIN**:FETCH JOIN是HQL的一种特殊连接类型,用于优化查询性能,特别是在处理集合时。通过使用FETCH JOIN,可以一次性加载关联对象或集合,避免了多次查询数据库的问题,提高了数据加载效率。 6. **...

    hibernate hql基本操作

    此外,在使用`scroll()`或`iterate()`方法时,`fetch`连接是不可用的。 #### 六、Fetch策略 - **Fetch策略**:使用`fetch all properties`可以在第一次查询时立即加载原本需要懒加载的属性。例如`from Document ...

    Hibernate HQL.doc

    需要注意的是,`fetch`连接不应在使用`scroll()`或`iterate()`的查询中使用,且与`right join fetch`或`full join fetch`的组合无意义。 4. 属性级别的延迟获取(Lazy Fetching): 如果某个对象属性被配置为延迟...

    hibernate 中HQL语句查询学习笔记

    ### Hibernate中HQL语句查询学习笔记 #### HQL基础 **HQL**(Hibernate Query Language)是Hibernate框架推荐使用的查询语言,它提供了一种面向对象的方式来查询数据库,支持多种复杂的查询操作,如继承、多态及...

    hibernate_hql.rar_HQL

    本篇文章将深入探讨HQL的使用、特点以及在实际项目中的应用。 首先,HQL是Hibernate提供的一个强大的查询工具,它允许开发者用类名和属性名来代替表名和列名,从而避免了直接操作SQL语句的繁琐。HQL支持基本查询、...

    HIBERNATE HQL

    本文将详细介绍HQL的基本概念、特点及其使用方法。 #### 二、HQL的基本特性 1. **大小写敏感性** - HQL查询语句对于关键字、函数名等不是大小写敏感的,但是Java类名和属性名是区分大小写的。例如,`SeLeCT`、`...

    hibernate的hql语句

    【hibernate的HQL语句】是Hibernate框架中用于操作数据库的重要组成部分,它是一种面向对象的查询语言,类似于SQL,但更加强调对象的概念。HQL能够处理复杂的对象关系,如继承、多态和关联,使得在进行SSH(Spring、...

    Hibernate查询语言(HQL)

    注意,FETCH 通常与 ITERATE 方法结合使用,而不是 SCROLL 或其他方法,因为 SCROLL 等方法可能不支持懒加载。 #### 六、显式与隐式 JOIN - **显式 JOIN**:使用显式 JOIN 形式时,需要明确地指定 JOIN 关键字。 ...

    Hibernate查询语言(HQL) 语法参考

    HQL(Hibernate Query Language)是 Hibernate 框架中的一种强大的查询语言,它类似于 SQL 语句,但是它是完全面向对象的查询语言,可以理解继承、多态和关联等概念。 大小写敏感性问题 在 HQL 中,除了 Java 类与...

    Hibernate 经常用的一些HQL语句

    下面将详细介绍HQL在实际开发中常用的几种用法。 #### 1. 基本查询 - **全表查询**:`String hql = "from User";` 这条语句用于查询User表中的所有记录。 - **条件查询**:如`String hql = "from User where ...

    hibernate 的HQL 语言入门与提高

    需要注意的是,`fetch` 不能与 `iterate()` 方法结合使用,也不应与 `setMaxResults()` 或 `setFirstResult()` 一起使用,因为这可能导致异常或非预期的行为。 HQL 提供了丰富的功能,包括对继承、多态的支持,以及...

    hql语句经典教程

    除了标准的`join`类型,HQL还支持`full join`,尽管在实际应用中不常见。`fetch join`对于集合关联特别有用,因为它允许在单个查询中初始化关联对象,从而减少数据库交互次数。 ### 7. 总结 HQL是Hibernate中用于...

    常用的hql语句用法解析

    但`fetch`连接不应在使用`scroll()`或`iterate()`的查询中使用,且`full join fetch`和`right join fetch`没有实际意义。 4. `select`子句 `select`子句用于定义查询返回的内容。你可以选择返回整个对象,或者只...

    HQL语言教程[归类].pdf

    HQL是Hibernate框架中用于检索和操作对象关系映射数据的强大工具,其语法和SQL有诸多相似之处,但设计理念和功能更为面向对象。 HQL在大小写敏感性上与SQL有所不同。除了Java类和属性名称要求严格区分大小写之外,...

    hibernate查询语言hql

    Hibernate查询语言(HQL)是Java开发者用于操作Hibernate ORM框架中的对象关系映射数据的一种强大的查询工具。HQL是面向对象的,它允许开发者用类名和属性而不是表名和列名来编写查询,极大地提高了代码的可读性和可...

    HQL详解

    HQL还支持对关联实体和集合中的元素指定别名,这时需要使用`JOIN`关键字: ``` FROM Cat AS cat INNER JOIN cat.mate AS mate LEFT OUTER JOIN cat.kittens AS kitten ``` 这里使用了不同的连接类型,它们分别是:...

    hql语句大全hql语句大全

    HQL(Hibernate Query Language)是Hibernate框架中用于执行数据库操作的一种强大的查询语言。它提供了面向对象的语法,允许开发人员以一种接近于编程语言的方式进行数据访问,极大地简化了SQL语句的编写过程,提升...

Global site tag (gtag.js) - Google Analytics