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

jpp*_*ade 3 java hibernate hibernate-filters

我想使用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();
Run Code Online (Sandbox Code Playgroud)

它只返回myUser是收件人的邮件?

有可能和如何?

非常感谢 !

Yog*_*esh 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();
Run Code Online (Sandbox Code Playgroud)

在创建标准时,请查看此内容以供参考!

如果您只想使用过滤器,那么我希望您已经在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>
Run Code Online (Sandbox Code Playgroud)

或者通过注释

@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;
Run Code Online (Sandbox Code Playgroud)

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

Filter filter = session.enableFilter("userRecipient");
filter.setParameter("userParam", myUser);
Run Code Online (Sandbox Code Playgroud)

更新

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

过滤器的示例用法可以是如果你有多对多关系的Movies表和Actor表,就像Leonardo Dicaprio可以同时有很多电影一样titanic可以有很多演员,这里Actor显然你会明白你只想要那些Actor已经表演过的电影in,所以你可以在这里使用过滤器,它应用于MoviesActor类中映射的集合.这种方式当你Actor通过名称的简单标准得到对象时,没有别的东西,并且操作员在对象上访问它的Movie集合,它将只返回该演员已执行的电影.这也意味着无论你如何从数据库中获取对象,当你访问它的集合时,它将为你提供这个演员所执行的电影.ActorActorMovieActor

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

我希望你理解过滤器和标准的基本概念,从我对你的问题的理解,如果你使用标准会更好!