Hibernate 筆記大全三
hibernate三套查詢:
一、HQL查詢(Hibernate Query Language)
sql查詢: 表 行 列 (select * from stu_info)
hql查詢: 持久類 對象 屬性 (select s from Student as s)
操作步驟:
a. 得到Session.
b. 定義hql語句。
c. Query query = 調用session.createQuery(hql)創建查詢.
爲hql語句中的佔位符設置參數setParameter(int position, Object val).
如果要分頁查詢的話調用:
query.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
query.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
d. 調用query的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
1. from子句:
語法:
from 持久化類 [as s 對象|別名] from User as s | from User | from User s
2. select子句:能夠明確查詢哪些列。
語法:
select 對象名 from 持久化類 [as s 對象|別名] --> List<Student>
select 對象.屬性, 對象.屬性 from 持久化類 [as s 對象|別名] --> List<Object[]>
3. 關聯(面向對象)與連接(數據庫):
a. 隱式關聯: @ManyToOne、@OneToOne (關聯的是實體屬性)
select s from 持久化類 s where s.關聯的實體屬性.屬性 (ognl)
b. 顯式關聯: @OneToMany、@ManyTOMany (關聯的是集合屬性)
select t from 持久化類 t inner join t.關聯的集合屬性 s where s.屬性 = ? (ognl)
c. 抓取連接:join fetch
select s from 持久化類 s join fetch s.關聯的屬性.
4. 聚集函數:統計函數
max、min、count()、avg()、sum()
5. order by : 排序
6. group by : 分組
7. having : 分組後過濾。
8. where 子句: 設置過濾條件。
hql語句能支持的表達式,運算符算符特別多。(用法與sql語句差不多).
-- 支持常用的運算符與表達式:
=、<、<=、>、>=、!=、not、distinct、between ... and、like、or、and
between, is null, is not null, is empty, is not empt、 concat(...,...)
-- 支持操作集合運算符:
size()|size, minelement(), maxelement(), minindex(), maxindex()
-- EJB-QL:
substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(),
bit_length(), mod()
9. 子查詢:與sql語句用法完全一樣把子查詢部分放在()裏面。
in 、not in
10. 多態查詢。
hibernate能夠完全理解類的繼承關係,當你查詢父類時,它會把父對象查詢出來,並且還會把子類對象查詢出來。
from java.lang.Object
11. 命名查詢(Named Query)。
它是把所有的查詢語句,寫在一個專門的xml文件中,到時你通過一個名字就可訪問它。
第一種方式:
xxx.hbm.xml文件。
a. <query name="起個名字">hql語句</query>
b. <mapping resource="org/fkjava/domain/query.hbm.xml"/>
c. Query query = session.getNamedQuery("起個名字")
第二種方式:
a. 在持久化類上加註解:
@NamedQuery(name="起個名字", query="hql語句")
二、Criteria(條件查詢):
不需要寫任何查詢語句 hql + sql都不需要寫,完全面向對象。
操作步驟:
a. 得到Session.
b. Criteria criteria = 調用session.createCriteria("持久化類")創建查詢.
criteria.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
criteria.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
c. 調用criteria的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
Criteria類的方法:
1. add(Criterion) : 添加查詢條件。
a. Restrictions 工具類專門創建查詢條件,把表達式,運算符改成了靜態的方法。
如果找不對應的方法就直接用sqlRestriction(sql)方法。
Restrictions.le("age", 300) --> Criterion
b. Property 工具類專門創建查詢條件。
Property.forName("屬性名").le(300) --> Criterion
c. Criterion 代表一個查詢條件。
2. addOrder(Order) : 添加排序.
a. Order類生成排序對象:
-- Order.asc("屬性名")
-- Order.desc("屬性名")
b. Property類:
-- Property.forName("屬性名").asc();
-- Property.forName("屬性名").desc();
3. setProjection(Projection) : 設置查詢哪些列。(投影就是基於列的運算)
a. Projections 創建列的工具類。
Projections.property("name") --> 創建Projection.
b. ProjectionList: 組合查詢的多列。
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("name"));
pl.add(Projections.property("age"));
4. setFetchMode() : 抓取連接。
-- setFetchMode("關聯實體屬性", FetchMode.JOIN) // 立即加載
-- setFetchMode("關聯實體屬性", FetchMode.SELECT) // 延遲加載
5. createAlias() : 創建關聯查詢。
用createAlias創建關聯查詢,添加的查詢條件還是爲持久化類添加的
6. createCriteria() : 創建關聯查詢。
用createCriteria創建關聯查詢,添加的查詢條件是爲關聯實體添加的.
7. 離線查詢(DetachedCriteria): 相當於定義了一條查詢語句
a. 創建:
DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
b. 查詢:
Criteria criteria = dc.getExecutableCriteria(session);
離線查詢的主要目的是爲了做子查詢!
三、Native Sql Query(原生的sql查詢)
SQLQuery ---> Query子類
操作步驟:
a. 得到Session.
b. 定義sql語句。
c. SQLQuery query = 調用session.createSQLQuery(sql)創建查詢.
爲hql語句中的佔位符設置參數setParameter(int position, Object val).
如果要分頁查詢的話調用:
query.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
query.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
d. 調用query的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
SQLQuery類:
1. addEntity() : 實體查詢
2. addScalar() : 標量查詢(標明查詢哪些列)
3. addJoin() : 關聯查詢
addJoin("t", "s.teacher") : 關聯查詢(將t開頭的數據,關聯到學生的teacher屬性裏)
4. 命名查詢。
第一種方式在配置文件(xxx.hbm.xml):
<!-- 定義查詢語句 -->
<sql-query name="sql_query_1">
sql語句
<!-- addEntity: 實體查詢 -->
<return class="org.fkjava.domain.Student" alias="s"></return>
<!-- addEntity: 實體查詢 -->
<return entity-name="org.fkjava.domain.Teacher" alias="t"></return>
<!-- addScalar: 標量查詢 -->
<return-scalar column="s.stu_name"/>
<!-- addJoin: 關聯查詢 -->
<return-join alias="t" property="s.teacher"></return-join>
</sql-query>
第二種方式在持久化類上加註解:
@NamedNativeQuery(name="sql_query_2", resultSetMapping="rs", query="sql語句"/>
@SqlResultSetMapping(name="rs", entities={}, columns={})
一、HQL查詢(Hibernate Query Language)
sql查詢: 表 行 列 (select * from stu_info)
hql查詢: 持久類 對象 屬性 (select s from Student as s)
操作步驟:
a. 得到Session.
b. 定義hql語句。
c. Query query = 調用session.createQuery(hql)創建查詢.
爲hql語句中的佔位符設置參數setParameter(int position, Object val).
如果要分頁查詢的話調用:
query.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
query.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
d. 調用query的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
1. from子句:
語法:
from 持久化類 [as s 對象|別名] from User as s | from User | from User s
2. select子句:能夠明確查詢哪些列。
語法:
select 對象名 from 持久化類 [as s 對象|別名] --> List<Student>
select 對象.屬性, 對象.屬性 from 持久化類 [as s 對象|別名] --> List<Object[]>
3. 關聯(面向對象)與連接(數據庫):
a. 隱式關聯: @ManyToOne、@OneToOne (關聯的是實體屬性)
select s from 持久化類 s where s.關聯的實體屬性.屬性 (ognl)
b. 顯式關聯: @OneToMany、@ManyTOMany (關聯的是集合屬性)
select t from 持久化類 t inner join t.關聯的集合屬性 s where s.屬性 = ? (ognl)
c. 抓取連接:join fetch
select s from 持久化類 s join fetch s.關聯的屬性.
4. 聚集函數:統計函數
max、min、count()、avg()、sum()
5. order by : 排序
6. group by : 分組
7. having : 分組後過濾。
8. where 子句: 設置過濾條件。
hql語句能支持的表達式,運算符算符特別多。(用法與sql語句差不多).
-- 支持常用的運算符與表達式:
=、<、<=、>、>=、!=、not、distinct、between ... and、like、or、and
between, is null, is not null, is empty, is not empt、 concat(...,...)
-- 支持操作集合運算符:
size()|size, minelement(), maxelement(), minindex(), maxindex()
-- EJB-QL:
substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(),
bit_length(), mod()
9. 子查詢:與sql語句用法完全一樣把子查詢部分放在()裏面。
in 、not in
10. 多態查詢。
hibernate能夠完全理解類的繼承關係,當你查詢父類時,它會把父對象查詢出來,並且還會把子類對象查詢出來。
from java.lang.Object
11. 命名查詢(Named Query)。
它是把所有的查詢語句,寫在一個專門的xml文件中,到時你通過一個名字就可訪問它。
第一種方式:
xxx.hbm.xml文件。
a. <query name="起個名字">hql語句</query>
b. <mapping resource="org/fkjava/domain/query.hbm.xml"/>
c. Query query = session.getNamedQuery("起個名字")
第二種方式:
a. 在持久化類上加註解:
@NamedQuery(name="起個名字", query="hql語句")
二、Criteria(條件查詢):
不需要寫任何查詢語句 hql + sql都不需要寫,完全面向對象。
操作步驟:
a. 得到Session.
b. Criteria criteria = 調用session.createCriteria("持久化類")創建查詢.
criteria.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
criteria.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
c. 調用criteria的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
Criteria類的方法:
1. add(Criterion) : 添加查詢條件。
a. Restrictions 工具類專門創建查詢條件,把表達式,運算符改成了靜態的方法。
如果找不對應的方法就直接用sqlRestriction(sql)方法。
Restrictions.le("age", 300) --> Criterion
b. Property 工具類專門創建查詢條件。
Property.forName("屬性名").le(300) --> Criterion
c. Criterion 代表一個查詢條件。
2. addOrder(Order) : 添加排序.
a. Order類生成排序對象:
-- Order.asc("屬性名")
-- Order.desc("屬性名")
b. Property類:
-- Property.forName("屬性名").asc();
-- Property.forName("屬性名").desc();
3. setProjection(Projection) : 設置查詢哪些列。(投影就是基於列的運算)
a. Projections 創建列的工具類。
Projections.property("name") --> 創建Projection.
b. ProjectionList: 組合查詢的多列。
ProjectionList pl = Projections.projectionList();
pl.add(Projections.property("name"));
pl.add(Projections.property("age"));
4. setFetchMode() : 抓取連接。
-- setFetchMode("關聯實體屬性", FetchMode.JOIN) // 立即加載
-- setFetchMode("關聯實體屬性", FetchMode.SELECT) // 延遲加載
5. createAlias() : 創建關聯查詢。
用createAlias創建關聯查詢,添加的查詢條件還是爲持久化類添加的
6. createCriteria() : 創建關聯查詢。
用createCriteria創建關聯查詢,添加的查詢條件是爲關聯實體添加的.
7. 離線查詢(DetachedCriteria): 相當於定義了一條查詢語句
a. 創建:
DetachedCriteria dc = DetachedCriteria.forClass(Student.class);
b. 查詢:
Criteria criteria = dc.getExecutableCriteria(session);
離線查詢的主要目的是爲了做子查詢!
三、Native Sql Query(原生的sql查詢)
SQLQuery ---> Query子類
操作步驟:
a. 得到Session.
b. 定義sql語句。
c. SQLQuery query = 調用session.createSQLQuery(sql)創建查詢.
爲hql語句中的佔位符設置參數setParameter(int position, Object val).
如果要分頁查詢的話調用:
query.setFirstResult((當前頁碼 - 1) * 每頁顯示的數量); limit ?,? 的第一個問號。
query.setMaxResults(每頁顯示的數量); limit ?,? 的第二個問號。
d. 調用query的list()得到查詢結果,如果你明確知道只有一條記錄返回那就可以調用uniqueResult();
SQLQuery類:
1. addEntity() : 實體查詢
2. addScalar() : 標量查詢(標明查詢哪些列)
3. addJoin() : 關聯查詢
addJoin("t", "s.teacher") : 關聯查詢(將t開頭的數據,關聯到學生的teacher屬性裏)
4. 命名查詢。
第一種方式在配置文件(xxx.hbm.xml):
<!-- 定義查詢語句 -->
<sql-query name="sql_query_1">
sql語句
<!-- addEntity: 實體查詢 -->
<return class="org.fkjava.domain.Student" alias="s"></return>
<!-- addEntity: 實體查詢 -->
<return entity-name="org.fkjava.domain.Teacher" alias="t"></return>
<!-- addScalar: 標量查詢 -->
<return-scalar column="s.stu_name"/>
<!-- addJoin: 關聯查詢 -->
<return-join alias="t" property="s.teacher"></return-join>
</sql-query>
第二種方式在持久化類上加註解:
@NamedNativeQuery(name="sql_query_2", resultSetMapping="rs", query="sql語句"/>
@SqlResultSetMapping(name="rs", entities={}, columns={})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.