2014-02-25 73 views
2

我想使用Hibernate過濾器,但我不知道我想要做的就是儘可能Hibernate的過濾實體,其中在一對多的關係包含對象

我有2個實體:

信息和MessageUser。

消息有一個MessageUser的列表。

我想創建一個過濾器,所以我可以做這樣的事情:

final Session filteredSession = sessionFactory.openSession(); 
final Filter filter = filteredSession.enableFilter("userRecipient"); 
filter.setParameter("userRecipient", myUser); 
filter.validate(); 

final List<Message> userMessages = filteredSession.createQuery("from Message").list(); 

它返回我只是消息,其中MYUSER是收件人?

是否有可能以及如何?

非常感謝!

回答

4

如果您習慣使用的標準,你可以這樣

Session hbSession= sessionFactory.openSession(); 
Criteria criteria = hbSession.createCriteria(Message.class); 
criteria.createCriteria("msgUserList","userListAlias");// msgUserList is variable name of users list in Message 
criteria.add(Restrictions.eq("userListAlias.user",myUser));//user is variable for User type in msgUserList's class. 
List<Message> userMessages = criteria.list(); 

創建標準看一看this參考,同時創造條件!

如果你只想使用過濾那麼我希望你有你的UserList一些事情配置過濾器像波紋管

由*的.hbm.xml

<hibernate-mapping package="com...."> 
    <class name="Message" table="message_table"> 
     .... 
     <list name="msgUserList" inverse="true" cascade="all"> 
      <key column="user_id" /> 
      <one-to-many class="MessageUsers" /> 
      <filter name="userRecipient" condition="user_id =:userParam" /> 
     </list> 
    </class> 
    <filter-def name="userRecipient"> 
     <filter-param name="userParam" type="User" />//User is class 
    </filter-def> 
</hibernate-mapping> 

或註釋

@Entity 
@FilterDef(name="userRecipient", 
[email protected](name="userParam", type="PAKAGE.User")) 
@Table(name = "message_table", catalog = "your_db") 
public class Message{ 

... 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "stock") 
@Filter(name = "userRecipient",condition="user = :userParam") 
public List<MessageUser> msgUserList; 

after這一點,你就可以得到您的過濾工作

Filter filter = session.enableFilter("userRecipient"); 
filter.setParameter("userParam", myUser); 

更新

Filter目的比Criteria不同,從我的理解,你可以說,Filter就像一個已經應用在標準你的班級或收藏有onoff切換。如果您的休眠會話啓用了某個篩選器,並且該篩選器的參數設置爲on,並且與指定此篩選器的類或集合相關的所有查詢都將始終根據條件返回篩選結果。這意味着您不必每次都明確定義它,並且通過使用getEnabledFilter("filterName"),您可以隨時更改該過濾器的參數。

濾波器

用法示例可以,如果你有Movies表和Actor表許多一對多的關係,就像Leonardo Dicaprio可以在同一時間有許多影片A titanic可以有很多演員,在這裏,當你得到Actor顯然你將只需要這些Actor已執行的電影,因此您可以在此處使用過濾器,該過濾器適用於在Actor類中映射的Movies的集合。當你Actor對象這樣說的名字,沒有別的,並獲得簡單的標準是Movie收集由.操作上Actor對象時,它會回報你僅是演員的執行電影。這也意味着,無論你如何從數據庫Actor對象當您訪問Movie收集Actor它會提供你這個演員已經

標準,另一方面進行電影的時候,你從某些數據庫需要的結果,您可以使用不需要複製的條件,而不希望稍後在hibernate會話中複製它。像Actor可以說Leonardo Dicaprio包含Movies是得到了他提名奧斯卡集合。這個系列將只在Actor對象通過一定的標準一去不復返了,且能夠將不提供對已不被此條件檢索等Actor對象。

我希望你明白過濾器和標準的基本概念,並從我對你的問題的理解會更好,如果你使用的標準!

+0

我什麼不知道要明白的是,爲什麼我必須把@Filter上msgUserList。例如,在這裏將msgUserList過濾?我的目標是獲取msgUserList包含我的用戶的所有Message對象(MessageUser表示manyTomany關聯)。 (我想避免的標準) – jpprade

+1

請更新答案 – Yogesh

+0

感謝您抽出時間詳細解釋,現在更清晰! – jpprade