Hibernate Query的小問題

Hibernate Query的小問題

List list1 = session.createQuery
        ("SELECT address "//
                + "FROM com.test.User "//
                + "where id<15 "//
                + "GROUP BY address "//
                + "ORDER BY address DESC ")//
                .list();

輸出如下

bbb_9  class java.lang.String
bbb_8  class java.lang.String
bbb_7  class java.lang.String
bbb_6  class java.lang.String
bbb_5  class java.lang.String
bbb_4  class java.lang.String
bbb_3  class java.lang.String
bbb_2  class java.lang.String
bbb_14  class java.lang.String
bbb_13  class java.lang.String
bbb_12  class java.lang.String
bbb_11  class java.lang.String
bbb_10  class java.lang.String
bbb_1  class java.lang.String

這就造成了一個很尷尬的局面:DESC排序條件下bbb_9大於bbb_14

補充一點SQL知識點:
SQL中的左連接(第一種方式)

Select e.id,e.name,d.name 
From s_emp e left join  department d 
on e.departmentid=d.id;

SQL中左連接(第二種方式)

Select e.id e.name,d.name
From s_emp e,department d
Where e.department = d.id()

左/右連接同理,()所在的另一側爲連接的方向,左連接說明=號左側的所有記錄都會顯示出來,無論與右邊是否獲得匹配,兩種書寫方式,第二種代碼簡單使用較爲廣泛

SQL中的內連接(第一種方式)

Select e.id e.name,d.name from s_emp e,department d
Where e.departmentId = d.id;

SQL中的內連接(第二種方式)

Select e.id e.name,d.name from s_emp e inner join department d
on e.departmentId = d.id;

內連接取的是兩個表的交集(前提是有能連接的字段),使用內連接可獲取兩個表公共部分的記錄

HQL中的內/左/右連接

SELECT e.id,e.name,d.name FROM s_emp e INNER JOIN e.department d;
SELECT e.id,e.name,d.name FROM s_emp e LEFT JOIN e.department d;
SELECT e.id,e.name,d.name FROM s_emp e RIGHT JOIN e.department d;

更簡單的代碼如下(獲得s_emp的department屬性,再獲得department表下的name屬性)

SELECT e.id,e.name,e.department.name FROM s_emp e;

HQL中使用佔位符

        Session session = sessionFactory.openSession();
        session.beginTransaction();

        List list = session.createQuery(
                "FROM com.test.User WHERE id IN (:ids)")
                .setParameterList("ids", new Object[]{1,5,25})
                .list(); 
        for (Object obj : list) {
            System.out.println(obj);
            System.out.println(obj.getClass());
        }

        session.beginTransaction().commit();
        session.close();

PS:SetParamterList的參數沒有int型,所以只能用屬性佔位的方式

不使用屬性佔位的方式如下

List list = session.createQuery(
                "FROM com.test.User WHERE id BETWEEN ? AND ?")
                .setParameter(0,5)
                .setParamter(1,10)//0`1爲索引
                .list(); 
        for (Object obj : list) {
            System.out.println(obj);
            System.out.println(obj.getClass());
        }
//使用?佔位符,再調用setParamter方法傳入參數有利於代碼複用

HQL語句的命名查詢:
將query語句寫在配置文件中,注意在配置文件中有些字符需轉義,常用的處理方法爲在配置文件中做如下配置

<query name = "HQL語句名xxx">
            <![CDATA[FROM com.test.User WHERE id BETWEEN :ids AND :ids]]>
</query>//代表這段Query語句中沒有需要轉義的字符

不採用硬編碼的方式,而是把HQL語句放在配置文件中,最好配置文件也書寫映射關係

List list1 = session.getNamedQuery("HQL語句的名字")
                .setParameter("ids", 5)
                .setParameter("ids", 10)
                .list();//

注意:UPDATE和DELETE方法不會通知Session緩存,即操作了數據庫但緩存中還未更新,解決方法:調用refresh()方法刷新緩存中的狀態–重新執行SELECT語句
Session中的幾個常用方法flush/clear/evict/reflesh

*事務併發–事務隔離級別:引用一篇文章
事務隔離級別詳解*
PS:修改事務隔離級別根據需要在hibernate.cfg.xml中修改
Read Uncommitted 、Read Committed 、Repeatable Read 、Serializable 分別對應1、2、4、8

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