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={})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章