1. 程式人生 > >hql關聯和連線查詢例項

hql關聯和連線查詢例項

<pre name="code" class="plain">

Hibernate提供了強大的查詢系統,使用Hibernate有多種查詢方法可以選擇:可以使用HibernateHQL查詢,也可以使用條件查詢,甚至可以使用原生的SQL查詢語句。其中HQL查詢時Hibernate配置的功能強大的查詢語句。HQL是非常有意識的被設計為完全面向物件的查詢,它可以理解如繼承、多型 和關聯之類的概念。

       下面我們來看一下Hibernate中的關聯查詢的基本知識。

一、連線概念

外連線:把捨棄的元組也儲存在結果關係中,而在其他屬性上填寫空值。

左外連線:返回那些存在於左表而右表中卻沒有的行,再加上內連線的行。

左連線特點:顯示全部左邊表中的所有專案,即使其中有些項中的資料未填寫完全。

在使用的時候主要根據自己的需要選擇時要保留join關鍵字右邊的表中的屬性還是要保留左邊的表的屬性

      內連線:內連線也叫連線,是最早的一種連線。還可以被稱為普通連線或者自然連線,內連線是從結果表中刪除與其他被連線表中沒有匹配行的所有行,所以內連線可能會丟失資訊。

當程式需要從多個數據表中獲取資料時,Hibernate使用關聯對映來處理底層資料表之間的連線,一旦我們提供了正確的關聯對映後,當程式通過Hibernate進行持久化訪問時,將可利用Hibernate的關聯來進行連線。

HQL支援兩種關聯join

的形式:implicit(隱式) 與explicit(顯式)

顯式form子句中明確給出了join關鍵字,而隱式使用英文點號(.)來連線關聯實體。

受支援的連線型別是從ANSI SQL中借鑑來的。

inner join(內連線)

left outer join(左外連線,outer 可以省略)

right outer join(右外連線,outer 可以省略

full join (全連線,並不常用)

使用顯式連線,可以通過with或者on關鍵字來提供額外的join條件

二、連線操作

下面來看我的表的結構:

user表

store表

goods表

order表

ordergoods表

表對應的model

public class User {
   private int userId;//使用者ID
   private String userName;//使用者名稱
   private String userPassword;//使用者密碼
   private Store store;
  private Set<Orders> orderSet = new HashSet<Orders>();
<//get和set方法省略
}

public class Store {
	private int storeId;// 主鍵
	private User user;// user的id是Store的外碼
	private String storeName;
	private String storeAdress;
	private String storePhone;
        private Set<Goods> goodsSet=new HashSet<Goods>();
       //get和set方法省略
}

public class Orders {
	private int orderId;// 主鍵
	private User user;// User的主鍵作為Orders的外來鍵。
	private String orderCount;
	private String totalPrice;
        private Set<Goods> goodsSet = new HashSet<Goods>();

}

public class Goods {
	
	private int goodsId;// 主鍵
	private Store store;// ID外來鍵,來自Store
	private String goodsName;
	private String goodsPrice;
	private Set<Orders> orderSet = new HashSet<Orders>();
}

xml檔案就省略了

1、user表和store表連線查詢store表中的使用者名稱為id的store表中的一行資料。使用的是內連線,當然也可使用其他連線方式。

    //store.user 連線操作用的是Store物件中的user,只能查找出指定userId的資料,內連線只會儲存兩張表中
    //有相同欄位的資料。
    String hql="select store from Store store inner join store.user user on user.userId=:id";


2、左外連線user表和store表連線查詢store表中的使用者名稱為id的store表中的一行資料。
     //hql1會查詢出Store中的全部資料,因為使用的是左外連線,所以該連線將Store表所有的記錄都保留了。
     String hql1="select store from Store store left join store.user user with user.userId=:id";

3、右外連線user和store表
    //但是如果迴圈列印store物件中的資料可能會丟擲空引用的異常,因為查詢出來的結果包含了user表中的所有資料,但是store的可能只有一條。
    String hql2="select store from Store store right join store.user user with user.userId=:id";

4、使用左外連線user和store表,查詢某一個使用者的訂單,User類中有一個Orders的set集合物件,使用fetch將滿足條件的訂單讀取到oederSet集合中,將該訂單

對應的商品資訊讀取到goodSet中。

//hql3中的where user.userId=:id是將order表中的外碼userId=id的選擇出來連線。
//返回的User的物件中的屬性,使用fetch連線抓取order物件中的的屬性到SetOrder集合中
//同時也會去抓取order物件中關聯的goodSet中的屬性。
//把該訂單中的商品資訊儲存在goodSet集合中。
String hql3="select distinct user from User user left join fetch user.orderSet where user.userId=:id";

5、使用左外連線查詢Store物件選中的goodsSet集合,將商家的商品資訊抓取到集合中。商家和商品一對多的關係。

//hql1會查詢Goods表中的全部資料,根據我們的配置檔案中的關聯關係去抓取Goods物件中的goodsSet中的全部物件。
String hql1 = "select distinct store from Store store left join fetch store.goodsSet ";
//hql2會查詢Goods表storeId=pk的全部資料。條件應該用where不能用with。
String hql2 = "select distinct store from Store store left join fetch store.goodsSet goods where store.storeId=:storeId";

6、使用隱式連結查詢多對多中的orders和goods表,根據訂單號查詢訂單,下面的查詢語句會將關聯的商品資訊抓取到Orders類的goodsSet集合中。

String hql="select orders from Orders orders,Goods goods where orders.orderId=:orderId";

7、使用左外連線根據外碼userId,查詢某一個使用者的訂單,也就是Orders類中的user物件查詢多對多關係中的orders和goods表,返回orders物件。下面查詢語句會將關聯的商品資訊抓取到Orders類的goodsSet集合中,連線也可使用inner join,right join。

String hql = "select distinct orders from Orders orders left join fetch orders.goodsSet goods where orders.user.userId=:userId";


相關推薦

hql關聯連線查詢例項

<pre name="code" class="plain"> Hibernate提供了強大的查詢系統,使用Hibernate有多種查詢方法可以選擇:可以使用Hibernate的HQL查詢,也可以使用條件查詢,甚至可以使用原生的SQL查詢語句。其中HQL查詢

hibernate DetachedCriteria多對一關聯連線查詢

前幾天在專案裡遇到了多對一關聯查詢的問題,現有vendor_info的site_code 欄位 和department裡面的dept_code欄位是相對應的. 需求是根據在vendor_info的site_code欄位顯示 該欄位在department的are

關於HQL Criteria Restrictions.eq 兩表關聯三表關聯查詢分析總結筆記

兩表關聯 TBorrow表和TUser表關聯ID查詢,依據 <many-to-one name="TUserByAdminId" class="com.shop.model.TUser" fetch="select"> DetachedCriteria cr

關於HQL Criteria Restrictions.eq 兩表關聯三表關聯查詢分析總結筆記

兩表關聯 TBorrow表和TUser表關聯ID查詢,依據 <many-to-one name="TUserByAdminId" class="com.shop.model.TUser" fetch="select"> DetachedCriteria

HQLSQL查詢

spa 包含 生成 2-0 連接 exec 刪除對象 別名 ets 轉自http://blog.csdn.net/aaa1117a8w5s6d/article/details/7757097 HQL和SQL的區別 標簽: sqlhibernatejavasession

【JAVAEE學習筆記】hibernate04:查詢種類、HQL、Criteria、查詢優化練習為客戶列表增加查詢條件

沒有 arrays getpara tex response 寫法 sum exceptio 提高 一、查詢種類 1.oid查詢-get 2.對象屬性導航查詢 3.HQL 4.Criteria 5.原生SQL 二、查詢-HQL語法 //學習HQL語法 public

hibernate中的HQLQBC查詢

  建立session及事務 //1.讀取src下hibernate.cfg.xml配置檔案 Configuration cft = new Configuration(); Configuration configure = cft.con

第64篇 自關聯 分組查詢聚合查詢 Q查詢 F查詢 ORM進階

1. 刪除‘alex’所帶班級的 的全部學生 2. 自關聯             3. 多對多的自關聯        symmetric &nbs

SQL關聯查詢 直接join 查詢的區別

SQL語句執行的時候是有一定順序的。 1.from先選擇一個表,構成一個結果集。 2.where對結果集進行篩選,篩選出需要的資訊形成新的結果集。 3.group by對新的結果集分組。 4.having篩選出想要的分組。 5.select選擇列。 6.order by當所有的條件都弄完了。最後排

SQL關聯查詢 直接join 查詢的區別

proc 認證 ado con pan exp type rip 圖片 SQL語句執行的時候是有一定順序的。 1.from先選擇一個表,構成一個結果集。 2.where對結果集進行篩選,篩選出需要的信息形成新的結果集。 3.group by對新的結果集分組。 4.havin

動態連線DNS查詢超時

最近,有許多Kubernetes使用者關於從Pods中查詢DNS的錯誤報告,有時需要5秒甚至更長的時間:編織#3287, 庫伯內特斯#56903. 在這篇文章中,我將解釋造成這種延遲的根本原因,討論一些緩解措施,並介紹核心修復。 背景 在Kubernetes中,POD訪問DNS伺服器的最常

連線查詢資料庫設計

-- 連線查詢 -- inner join ... on -- 兩個表連線查詢 select * from students inner join classes -- 查詢能夠對應班級的學生以及班級資訊 select * from students inner join classes on student

JPA之@GeneratedValue註解連線例項

本文雖然是小熙轉載,但在此基礎上也加了些小熙個人的連線例項、見解、博文連結,希望大家喜歡 JPA的@GeneratedValue註解,在JPA中,@GeneratedValue註解存在的意義主要就是為一個實體生成一個唯一標識的主鍵(JPA要求每一個實體Entity,必須有且只有一個主鍵)

資料查詢連線查詢、子查詢聯合查詢

一、連線查詢 基本含義:將兩個以上的表(資料來源),連線起來成為一個數據源。 基本形式:from 表1 [連線方式] join 表2 [on 連線條件] join 為連線查詢關鍵字--必須 [連線方式] [on 連線條件]為可選性  交叉連線:&nb

mysql(連線查詢資料庫設計)

  --建立學生表 create table students ( id int unsigned not null auto_increment primary key, name varchar(20) default '',

分頁、連線查詢、自關聯、子查詢

分頁   limit 開始位置, 查詢數目 或者 limit 查詢數目          -- 限制查詢出來的資料個數        select * from

mysql筆記五之分頁、連線查詢、自關聯、子查詢

1.-- 分頁     -- limit start, count     -- 表示獲取多少條資料     -- start 預設值為0 可以省略     -- 表示跳過多少

MySQL 子查詢連線查詢

SELECT * FROM grade; SELECT * FROM result; SELECT * FROM student; SELECT * FROM subject; SELECT s.StudentNo ,s.StudentName ,j.SubjectName ,r.Stude

MySQL之連線查詢,多表查詢(適合練習初學)

Join連線圖 針對以上的多表查詢,我們嘗試做以下的實驗: Join實驗: CREATE TABLE `t_dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT

MySql資料庫連線查詢與自關聯(七)

先看個問題 問:查詢每個學生每個科目的分數 分析:學生姓名來源於students表,科目名稱來源於subjects,分數來源於scores表,怎麼將3個表放到一起查詢,並將結果顯示在同一個結果集中呢