Hibernate查詢相關知識

來源:互聯網
上載者:User

首先介紹get()和load()方法的區別:
get()方法和load()方法的區別主要在於對二級緩衝的使用上。
load()方法會使用二級緩衝,而get()方法在一級緩衝沒有找到會直接查詢資料庫,不會去二級緩衝中尋找。
get():如果在資料庫中沒有記錄會返回空,get()無論如何都會返回資料.
load():如果資料庫中沒有記錄會拋出異常,如果有資料返回的是一個代理對象。

list和iterator()方法之間的區別:(N+1?)
list()方法在執行時,直接執行查詢結果所需要的查詢語句。
iterator()方法則是先執行得到對象ID的查詢,然後在根據每個ID值去取得所要查詢的對象。
因此:對於list()方式的查詢通常只會執行一個SQL語句,而對於iterator()方法的查詢則可能需要執行N+1條SQL語句(N為結果集中的記錄數).

結果集的處理方法不同:
list()方法會一次活的所有的結果集對象,而且他會依據查詢的結果初始化所有的結果集對象。如果在結果集非常龐大的時候會佔據非常多的記憶體,甚至會造成記憶體溢出的情況發生。
iterator()方法在執行時不會一次初始化所有的對象,而是根據對結果集的訪問情況來初始化對象。一次在訪問中可以控制緩衝中對象的數量,以避免佔用過多的緩衝,導致記憶體溢出情況的發生。

HQL:HQL是一種物件導向的查詢語言,HQL的操作對象是類、執行個體和屬性等。
SQL:sql的操作對象是資料表和列等資料對象。
Hql是完全物件導向的查詢語言,因此可以支援繼承和多條等特徵。
HQL查詢依賴於Query類,每個Query執行個體對應一個查詢對象。

定參數的功能,Query 介面才是真正的HQL查詢介面。
//建立一個Query 對象
Query query = session.createQuery ("from Customer as c where c.name=:customerName and c.age=:customerAge");
//動態綁定參數
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
//執行查詢語句,返回結果
List result = query.list();

HQL查詢步驟:
1:擷取Hibernate Session對象。
2:編寫HQL語句。
3:以HQL語句作為參數,調用Session的createQuery方法建立查詢對象。
4:如果HQL語句包含參數,調用Query的setXXX()方法為參數賦值。
5: 調用Query對象的list等方法遍曆查詢結果。

Query還包含兩個方法:
setFirstResult(int firstResult):設定返回的結果集從第幾條記錄開始。
setMaxResults(int maxResults):設定本次查詢返回的結果數。

實體的刪除和更新。

投影查詢:只查詢屬性的一部分。
   查詢一個屬性返回的是字串
   查詢二個欄位返回的是數組

動態構造查詢:主要用於幾十個表查詢;
       要構建一個新的對象,要加上一個建構函式;
   在new對象的時候要加上包名

不要使用count(*) 要count(持久化對象)

分組與排序:
Order by子句可以通過asc或desc關鍵字排序
     如:form User u Order by u.name asc,u.age desc;

Group by子句與統計查詢:
如: String hql = "select count(u),u.age from User u group by u.age having count(u)>10";
List list = session.createQuery(hql).list();

標準的SQL彙總函式都可以在HQL語句中使用,比如:count(),sum(),max(),min(),age()等

串連查詢:
內串連:inner join
左外串連:left outer join
右外串連:right outer join
全串連:full join(不常用)
迫切外串連:left outer join fetch,left join

fetch:用於一次性擷取串連資料,特別是集合資料。減少與資料庫互動的次數。

left out join:使用做外串連位於left join 左側表的所有記錄及對應的order類的記錄資訊都將顯示出來。
right out join:與 left out join 正好相反,right out join 返回的是HQL右側表中的所有記錄以及對應的Customer對象記錄資訊。

擷取集合資料的四種方式:
1:Hibernate.initialize(user.getOrder());
2:user.getOrder().size();
3:左右迫切串連
4:進階過濾器

條件查詢語句(Criteria Queries):利用對象進行物件查詢。
     主要的介面有:Criteria、Criterion和expression_r和Restrictions類組成。能夠支援在運行時動態產生SQL語句。

條件查詢步驟:
1:通過seesion的CreateCriteria()方法,建立一個Criteria對象
2:設定查詢對象,name指對象的屬性
3:把查詢條件添加到Criteria對象中
4:執行list()查詢返回結果。
條件查詢通過三個類完成:
Criteria:代表一次查詢.
Criterion:代表一個查詢條件.
Restrictions:產生查詢條件的工具類.

本地sql查詢:使用手寫的SQL來完成所有的create/update/delete操作也包括預存程序
本地sql步驟:
1:通過session建立一個SqlQuery對象。
2:編寫sql語句
3:以SQL語句作為參數,調用Session的createSQLQuery方法建立查詢對象
4:如果SQL語句包含參數,則調用Query的setXX方法為參數賦值
5:調用SQLQuery對象的addEntity或addScalar方法,將選出的結果與實體或標量值關聯.
如:HQL的sql
String sql = "select c.c_id as {c.id},c.c_name as {c.name} from CUSTOMER c where c.id = 1";
注意:如果使用*,表的別名和類的別名要一致
String sql1 = "select {c.*} from CUSTOMER c where c.c_id=2 ";
如:條件查詢的sql
SQLQuery query = session.createSQLQuery(sql);
query.addEntiy("c",Customer.class);

多態查詢:
多態查詢是指可以查詢到當前類及所有子類的執行個體,HQL和條件查詢都支援多態查詢。
如:hql語句查詢出所有的持久化對象
Query query = session.createQuery("from java.lang.object");
System.out.println(query.list());

HQL支援多態查詢,多態查詢是指查詢出當前類及所有子類的執行個體,
session.createQuery("from Employee"); or session.createCriteria(Employee.class);
如果Employee類有兩個子類:HourlyEmployee和SalariedEmployee,那麼這個查詢語句會查出所有的Employee執行個體,以及HourlyEmployee類和SalariedEmployee類的執行個體。
session.createQuery("from HourlyEmployee");
session.createCriteria(HourlyEmployee.class);//只檢索子類

查詢結果集排序:
Hql與條件查詢都支援查詢結果集排序,只是HQL採用Order by關鍵字,而條件查詢採用order類進行查詢結果排序。

分頁查詢:
分頁查詢是資料庫應用中常見的處理方式,Query和Criteia介面都提供了用於分頁查詢的方法.
setFistResult(int):指定從哪一個對象開始查詢,參數是索引位置從0開始。
setMaxResults(int):指定一次最多查詢的對象數量。

子查詢:
   1:查詢有一個訂單以上的客戶。
如:
from Customer c where 1<(select count(o) from c.orders o)

hql子查詢依賴於底層資料庫 對子查詢支援的能力。
所有的子查詢可以使用串連查詢和分組查詢語句來代替。
如:
select c from Customer c join c.orders o group by c.id having count(o)>1

如果子查詢返回多條記錄,可以使用關鍵字量化:
1:all 2:any 3:some 4:in 5:exists
如:
//返回所有訂單價格小於100的客戶
from Customer c where 100>all(select o.price form c.orders o)

//返回有一條訂單的價格小於100的客戶
from Customer c where 100>any(select o.price from c.orders o)

//返回有一條訂單的價格等於100的客戶
from Customer c where 100=some(select o.price from c.order o)

//返回有一條訂單的價格等於100的客戶
from Customer c where 100 = any (select o.prive from c.orders o)

//返回有一條訂單的價格等於100的客戶
from Customer c where 100 in (select o.price from c.orders o)

 

參數綁定:
1:傳統的JDBC的參數綁定
   如:
    PrepareStatement pre = connection.prepare("select * from User where user.name =n ?");
    pre.setString(1,"Zhao");
    ResultSet rs = pre.executeQuery();

Hibernate參數綁定:在hibernate中有4種參數綁定方式
1:按參數名稱(具名引數)綁定,在語句中定義具名引數要用":"開頭
2:按參數位置綁定
3:Hql查詢中可以通過setParameter()方法綁定任意類型的參數
4:setProperties()方法,將具名引數與一個對象的屬性值綁定在一起

如:參數":"開頭
Query query = session.createQuery("from User user where user.name = customername and user.age = :customerage");
   query.setString("customername",name);
   query.setInteger("customerage",age);

如:參數位置綁定
Query query = session.createQuery("from User user where user.name =? and user.age = ?");
   query.setString(0,name);
   query.setInteger(1,age);

如:setParameter他有三個參數一般寫兩個參數
String hql = "from User user where user.name = :customername";
Query query = session.createQuery(hql);
query.setParameter("customername",name,Hibernate.STRING);

如:setProperties
Customer customer = new Customer();
customer.setName("sdsd");
customer.setAge(99);
Query query = session.createQuery("from Customer c where c.name=:name and c.age = :age");
query.setProperties(customer);

 

定義命名查詢:
命名的SQL語句不是放在程式中,而是放在設定檔中,這種方式是以松耦合的方式配置SQL語句,可以提高程式解耦.

在Customer.hbm.xml設定檔中
<query name="findCustomer">
   <!CDAATA[from Customer c where c.name = :name] />
</query>
程式中的代碼:
Query query = session.getNamedQuery("findCustomer");
query.setString("name","tiger");
List list = query.list();

命名的SQL語句:
<sql-query name="mysqlquery">
   <!-- 關聯返回的結果與實體類 -->
   <return alias="s" class="com.lovo.po.Customer">
   <!-- 定義命名SQL查詢的SQL語句 -->
   select {c.*}
   from Customer Customer c where c.name like "劉德華"
</sql-query>
sql_query是hibernate-mapping元素的子項目,因此可以直接通過session訪問

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.