若是實體查詢用到了left,則會爲每一個left的實體生成獨立的sql語句並對應於對象,結果list獲得object泛型數組,object中包含若干對象
在left的過程當中,若是左關聯致使的爲空的一項做爲查詢條件,原本就會查詢不出致使主表無數據顯示,因此,條件查詢中儘管用
gc.ooo.xxx便可!
record:
//左關聯並不必定要用於select中
//list中包含三個,customer shop operator
List<GesCustomer> temList =new ArrayList<GesCustomer>();
could not initialize proxy - no Session
檢查下有沒有加@transactional
另外,這個主要是須要獲取關聯的對象,可是想去獲取,但是根本沒有取得操做,通常的加上Hibernate.init ,或其它操做便可
這是一個精典的問題:
由於咱們在hibernate裏面load一個對象出來時,用到的是代理對象,也就是說當咱們在執行load方法時並無發sql語句,而是返回一個proxy對象。只有當們具體用到哪一個get**方法時纔會發sql語句,纔會去數據庫查。可是當咱們把打開session,關閉session交給了srping去作時,當們load完以後咱們的session就會被srping關閉,若是咱們在jsp頁面或者其它的地方再去用get方法取值時就會報這個錯誤。
解決方法一:但若是咱們在hibernate用get方法就能夠解決取單個對象的問題,由於get方法直接發sql語句,把咱們想的數據從數據庫中get出來而後放在內存中。
若是咱們取單個對象能夠用get方法沒有問題;可是若是咱們取的的對象還有關聯對象時用get就有問題,由於它不會把關聯的對象取出來,但若是頁面上用到關聯的對象時也會報no session的問題
解決方法二:用到srping的filter(要加在strutsfilter有前面,由於它也有前後順序,有先進先出的原則)
在咱們的web.xml裏面加上
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這樣作就是讓opensession closesession全交給視圖部分,最後視圖部分用完了session再去關session就不會有上面的錯誤了
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance
before flushing: com.gjw.entity.building.GesBuilding
通常這種狀況是由於保存時從數據庫中獲取的遊離對象中的對象不爲空,可是其ID卻爲空。
Could not read entity state from ResultSet : EntityKey
是由於數據庫的字段與實體的屬性不匹配,好比實體中應該是manyto,而數據庫中是varchar
hibernate查詢過濾:
一個老師教許多學生,一個學生被許多老師教,一個學生有好多書,同一種書被許多同窗擁有.
要查詢教擁有書"a"的學生的老師!HQL如何寫呀?如何取值?
class teacher{
String id;
String name;
Set students;
}
class student{
String id;
String name;
Set teachers;
Set books;
}
class book{
String id;
String name;
Set students;
}
================================
這種寫法(t.students)確定是能夠的,你試試
SELECT t FROM teacher t join t.students s join s.books b where b.name = 'a'
================================
SELECT t FROM teacher t where t.students.books.name = 'a'
首先students.books這裏,students是集合,因此這個表達式是確定不對的
同理books.name也不對
================================
SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
這種方法沒有出錯!不過這種方式要用子查詢!
================================
是的,element(Set)和indice(List)均可以取集合中的元素,但用在where子句的條件是須要數據庫支持子查詢,mysql就不行
另外t.students s中s並非集合的意思,而是t的students對象的表別名,join t.students s這個hql,hibernate會翻譯成兩個表的內鏈接關
系
================另外一篇文章,和上面的結合就ok了================
今天在作一個項目須要作到Set集的數據過慮,由於在獲取一個User的時候不能將屬於這個User的Knowledge所有取出,再一個一個地篩選符
合條件的Knowledge,這樣作會在很大的程度降底系統性能。
在 Hibernate中類型爲Set、List的實體屬性也是能夠鏈接查詢的,例如User裏面有一個Set<Knowledge> knowledge屬性要獲取User中
Knowledge的isShared的屬性爲true的User而且在返回的User中的knowledges 中包含isShared爲true的Knowledge對象的時候,就要通Set的
過慮查詢(左鏈接查詢),在hibernate3.2.3之後的寫法如 下:
select distinct u from User u left join fetch u.knowledges k where k.isShare=true。
這樣就只會獲取knowledge的isShared爲true的User,而且User裏面的knowleges中包含knowledge的isShared爲true的Knowlege對象。
需 要注意的是:關鍵字distinct和fetch。要實現上面的數據過慮就得要這兩個關鍵字。第一個關鍵字是獨立的意思,第二個關鍵字是以一
條sql語句 執行。若是少了fetch這個關鍵字,則達不到目的。返回的結果是一個User包含isShared爲true和false的knowledge集合。
同理,若是Knowledge裏面還要Set、List屬性,而且也要據根這些屬性中的對象的某些屬性約束查詢的話(二級或三級鏈接查詢),也是一
樣能夠作到的。
object references an unsaved transient instance - save the transient instance before flushing: com.gjw.entity.area.GesArea
這個問題是因爲保存的時候對象的id爲空,可是這個對象不爲空