hibernate多對多過濾
Ⅰ hibernate 多對多查詢
兩種方法,既然你要hql語句就寫hql語句的吧:
select b from B as b,A as a where b.as=a.id and a.type=1
因為是對象,所以在比較時是以B的as來比專較A.id;
這樣即使查出了數據也會存在懶載入屬異常的問題,關於那個問題你可以在發帖子詢問.
上句不行用下句:
select b.id ,b.as from B as b,A as a where b.as=a.id and a.type=1;
因為查出來的是對象類型數組,所以在遍歷時需要花點心思,不過懶載入異常就不存在了.
如何遍歷網上很多,實在找不到,繼續發帖.
Ⅱ Hibernate 多對一和一對多嵌套,會查出很多數據怎麼辦
那就延遲載入
在xml 的 集合標簽上 加上 lazy="true",hibernate默認就是開啟了的
<set lazy="true" .....
Ⅲ hibernate 多對一,一對多,多對多, 在JAVA中怎麼理解呢
首先我要告訴你,資料庫描述表之間的關系是通過外鍵描述的,中是通過屬性描述的。
外鍵是什麼意思?舉個例子說,資料庫中,你有個表是學生表,
我們簡單點說有三列,一個是學生的id,一個是姓名,一個是班級的id
而在資料庫中,你會建一個班級表,
其中有id和班級的名稱,比如計算機三班,二班等等。
班級和學生,班級是一,學生是多。
而在hibernate中,為了簡單起見,一般會在學生類中將班級屬性設置成一個班級類,而在班級類中額外添加一個list或者set。這么做的好處簡單來說,是為了方便。
怎麼方便呢?
這么說吧,比如我們沒這么設置,而是在學生類中只有一個班級的id,那麼你查到一個學生,想看他班級的名稱,是不是還要根據班級的id,去班級表查找對應的名字,這么一來,就會十分麻煩,所以在hibernate中,如果表中有外鍵,那麼一般會將這個外鍵設置成那個表的實體類,這樣一來,我們就不需要多那一步了。
至於你說為什麼將屬性設置到班級的對象,然後保存學生的信息,學生表中就有班級id這個欄位的值了,這個問題,很簡單,因為你不僅把屬性保存到班級對象中了,你肯定還把這個班級對象作為屬性設置給學生了,所以就有了。
換句話說,你等於還是間接的設置了班級id,這個欄位,具體他們的對應關系,自然是在配置文件中顯示的。
不知道說了這么多,你能理解不。
手酸了,,,,希望對你有幫助。。。
Ⅳ hibernate 多對多HQL語句
類似於:
select score.price from Score score where score.stu.id="學生編號"
and score.sub.id="科目編號"
-------------------------------
補充一點,一般來說你這個成績表應該很多數據,如果這么用實體關聯查詢速度不是最快,建議是用SQL語句查詢
Ⅳ Hibernate多對多級聯查詢的問題
最好用一對多的關系來代替多對多的關系。也就是把中間表也單獨建一個類來。這樣控制方便,效率高。
Ⅵ 列舉Hibernate中多對多,一對多關系的配置
多對多配置
A方
<set name="A" cascade="all" inverse="false"
table="t_A">
<key
column="cid"></key>
<many-to-many class="ClassB"
column="ca"></many-to-many>
</set>
B方
<set name="B" cascade="all" inverse="true"
table="t_B">
<key
column="sid"></key>
<many-to-many class="ClassA"
column="cb"></many-to-many>
</set>
fetch 可以設置 "select" 和 "join「
在一對多中
fetch =
"select"是在查詢的時候先查詢出一端的實體,然後在根據一端的查詢出多端的實體,會產生1+n條sql語句;
說的詳細點就是:在執行hql的時候,實際上會先執行一條select * from tableA ....-->然後根據查 詢的結果去tableB裡面查詢(也是一條一條查詢,會產生n條語句)
fetch = "join"是在查詢的時候使用外連接進行查詢,不會差生1+n的現象,只會有1條sql語句
在執行hql的時候實際上執行的是一句多表查詢語句 select * from tableA a left join tableB b.....
cascade 簡單一些
cascade屬性的可能值有,all none save-update delete 他們的含義如下
all: 所有情況下均進行關聯操作,即save-update和delete。
none: 所有情況下均不進行關聯操作。默認為none。
save-update: 在執行save/update/saveOrUpdate時進行關聯操作。
delete: 在執行delete 時進行關聯操作。
Ⅶ Hibernate中多對多關系如何查詢
今天遇到了HIbernate中的抄多對襲對查詢問題,由於多對多的關系在實體中都是集合:所以查詢時的方式有所不同:代碼如下:public List<String getListNameByPtyg() { String sql="select t.trueName from KhUsers t join t.dictionaryInfos as s where s.name='普通員工' and s.fenleiCode='B'"; Query query=super.getSession().createQuery(sql); List<String result=query.list(); return result;}注意:1。查詢的欄位如trueName前面必須加上表的別名 2。t.dictionaryInfos as s:dictionaryInfos是實體中集合對象的名稱,後面的s其實是實體單個對象,where條件中就是以這個對象的欄位條件查詢的。
Ⅷ hibernate多對多性能的問題
使用HIBERNATE建議盡量不要用集合映射及繼承映射等,有關聯的實體只記錄外鍵,需要的時候根據外鍵載入實體,這樣不會造成性能問題
Ⅸ Hibernate中多對多關系的條件查詢HQL怎麼寫
不用那麼麻煩的。
其實你學過Hibernate的級聯查詢就非常簡單的。
比如:只查詢表A就行了,但必須在A的映射文件里
加上一個lazy="false"才行的。
試一試看看。。。
Ⅹ Hibernate 多對多怎麼刪除關聯
當你完成了多對多的映射,並且在映射文件對應的set(或這list,map)中開啟了級聯內刪除(即casecade=delete,大概這樣),就可容以在測試類中,使用get方法獲得對象,在使用set(或者list,map)的對呀刪除單個或全部元素的方法,例如list的remove(),removeAt(int index),map的remove( object key),最後在將get的對象使用session.update()方法即可完成級聯刪除。可以開啟控制台列印sql語句,檢查是否刪除。