隨筆-124  評論-194  文章-0  trackbacks-0

          以下文字摘自:JOINJOIN2, HQL, 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 functions. Similarly, you may refer to the minimum and maximum elements of a collection of basic type using the minelement and maxelement functions.

          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%'
          posted on 2007-07-26 16:44 我愛佳娃 閱讀(33587) 評論(1)  編輯  收藏 所屬分類: DB相關

          評論:
          # re: Join用法,HQL的方法,Hibernate中的fetch 2008-06-10 17:31 | jdlsfl
          不錯  回復  更多評論
            
          主站蜘蛛池模板: 巴青县| 宜宾市| 大渡口区| 若羌县| 乐亭县| 咸阳市| 那曲县| 遵化市| 南丹县| 吉木萨尔县| 清镇市| 临潭县| 临江市| 安溪县| 巴东县| 乐陵市| 樟树市| 乐昌市| 蓝山县| 玉山县| 颍上县| 和龙市| 孟连| 南部县| 安陆市| 镇江市| 唐山市| 英吉沙县| 砚山县| 友谊县| 裕民县| 东平县| 固原市| 沁阳市| 江达县| 沧州市| 凌海市| 平度市| 东明县| 龙南县| 彭山县|