Java 休眠过滤实体,其中oneToMany关系包含对象

Java 休眠过滤实体,其中oneToMany关系包含对象,java,hibernate,hibernate-filters,Java,Hibernate,Hibernate Filters,我想使用hibernate过滤器,但我不知道我想做的是否可行 我有两个实体: Message和MessageUser 消息具有MessageUser的列表 我想创建一个过滤器,以便执行以下操作: final Session filteredSession = sessionFactory.openSession(); final Filter filter = filteredSession.enableFilter("userRecipient"); filter.setParameter("

我想使用hibernate过滤器,但我不知道我想做的是否可行

我有两个实体:

Message和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();
final Session filteredSession=sessionFactory.openSession();
最终筛选器=filteredSession.enableFilter(“用户收件人”);
setParameter(“userRecipient”,myUser);
filter.validate();
final List userMessages=filteredSession.createQuery(“来自消息”).List();
它只返回myUser是收件人的消息

是否有可能以及如何做到这一点


非常感谢

如果您对标准感到满意,您可以创建如下标准

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();
或通过注释

@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;
更新

的目的不同于,根据我的理解,您可以说,
过滤器
就像一个已经应用于您的类或集合的标准,该类或集合有
打开
关闭
开关。如果您的hibernate会话启用了某些筛选器并设置了其参数,则该筛选器将
打开
,并且与指定了此筛选器的类或集合相关的所有查询将始终根据条件返回筛选结果。这意味着您不必每次都显式定义它,通过使用
getEnabledFilter(“filterName”)
您可以随时更改该过滤器的参数

过滤器的示例用法可以是,如果您有具有多对多关系的
电影
表和
演员
表,就像可以同时有多部电影一样,一个可以有多个演员,这里当您获得
演员
时,显然您只想要该
演员
在其中演出的电影,因此,您可以在这里使用过滤器,它应用于映射到
Actor
类中的
Movies
集合。这样,当您获得
Actor
对象时,只需简单的名称和其他条件,然后通过
Actor
对象上的
操作符访问它的
Movie
集合,它将只返回该Actor已执行的电影。这也意味着,当您访问
Movie
collection of
Actor
时,无论您如何从数据库中获取
Actor
对象,它都将为您提供该Actor在其中表演的电影

另一方面,当您需要来自数据库的结果时,可以使用条件,该结果具有某些不需要复制的条件,而您不希望稍后在hibernate会话中复制它。像《代码》里的演员,比如说《代码》里的莱昂纳多·迪卡普里奥(Leonardo Dicaprio),里面有一系列《代码》里的电影,这些电影让他获得了奥斯卡提名。当通过某些条件时,此集合将仅填充在
Actor
对象中,并且在未通过此条件检索的其他
Actor
对象上不可用


我希望你们理解过滤器和标准的基本概念,从我对你们问题的理解来看,若你们使用标准会更好

我不太明白的是为什么我必须把@Filter放在msgUserList上。在这里的示例中,是否会过滤msgUserList?我的目标是获取msgUserList包含我的用户的所有Message对象(MessageUser表示多个关联)。(我想避免使用标准)感谢您花时间详细解释,现在更清楚了!
@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);