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