2014-02-25 50 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