Hibernate过滤器实体,其中oneToMany关系包含一个对象

时间:2014-02-25 07:45:36

标签: java hibernate hibernate-filters

我想使用hibernate过滤器,但我不知道我想做什么是可能的

我有两个实体:

消息和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是收件人的邮件吗?

是否有可能以及如何?

非常感谢!

1 个答案:

答案 0 :(得分:6)

如果您对Criteria感到满意,可以创建像这样的标准

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以供参考!

如果您只想使用过滤器,那么我希望您已在User List上配置过滤器,例如bellow

按* .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", 
parameters=@ParamDef(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;

在此之后,您将能够使您的过滤器正常工作

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

<强>更新

Filter的目的与Criteria不同,根据我的理解,您可以说Filter就像已经应用于您的班级或集合on的标准off 1}}和on切换。如果您的hibernate会话启用了某个过滤器,其参数设置比该过滤器为getEnabledFilter("filterName"),并且与指定了此过滤器的类或集合相关的所有查询将始终根据条件返回过滤结果。这意味着您不必每次都明确定义它,并且使用Movies您可以随时更改该过滤器的参数。

过滤器的示例用法可以是Actor表和Actor表具有多对多关系,例如Leonardo Dicaprio可以同时拥有多部电影A {{ 3}}可以有很多演员,当你得到Actor时,显然你只想要那些Movies已经演出的电影,所以你可以在这里使用过滤器,它应用于{{1在Actor类中映射的。这种方式,当您通过简单的名称标准获取Actor对象时,只需通过Movie运算符.运算符Actor集合访问Actor对象,那个演员已经演出了。这也意味着无论您在访问Movie Actor集合时如何从数据库获取Actor对象,它都会为您提供此演员在其中执行的电影

另一方面,当您需要具有某些条件且不需要复制的数据库的结果时,您可以使用标准,而不希望稍后在hibernate会话中复制它。就像Leonardo Dicaprio一样,我要说Movies包含在奥斯卡提名他的Actor集合。此集合仅在经过某些条件时填充在Actor对象中,并且不会在未按此条件检索的其他{{1}}对象上提供。

我希望您了解过滤器和标准的基本概念,并且根据我对您的问题的理解,如果您使用标准会更好!