注释过滤@OneToMany关联的结果

我有两个表之间的父/子关系,以及我的Java类中的相应映射。 表格大概是这样的:

A (ref number, stuff varchar2(4000)) B (a_ref number, other number, foo varchar2(200)) 

和Java代码:

 @Entity class A { @Id @Column(name = "REF") private int ref; @OneToMany @JoinColumn(name = "A_REF", referencedName = "REF") private Set<B> bs; } @Entity class B { @Id @Column(name = "A_REF") private int aRef; @Id @Column(name = "OTHER") private int other; } 

这工作正常,但我想添加一个筛选器,从子表中检索行。 生成的查询如下所示:

 select a_ref, other, foo from B where a_ref = ? 

我希望它是:

 select a_ref, other, foo from B where a_ref = ? and other = 123 

额外的filter将只是一个列名和一个硬编码值。 有没有办法做到这一点使用hibernate注释?

我已经看了@JoinFormula ,但是我总是不得不从父表引用列名(在JoinFormula的name属性中)。

预先感谢您的任何build议。

它不被JPA支持,但是如果你使用hibernate作为JPA提供者,那么你可以使用注释@FilterDef@Filter

Hibernate核心参考文档

Hibernate3能够预先定义过滤条件并在类级别和集合级别连接这些过滤条件。 过滤标准允许您定义一个类似于现有的“where”属性和各种集合元素的限制条款。 但是,这些过滤条件可以被参数化。 然后,应用程序可以在运行时决定是否启用某些filter以及它们的参数值应该是什么。 filter可以像数据库视图一样使用,但它们在应用程序中被参数化。

为例

 @Entity public class A implements Serializable{ @Id @Column(name = "REF") private int ref; @OneToMany @JoinColumn(name = "A_REF", referencedColumnName = "REF") @Filter(name="test") private Set<B> bs; } @Entity @FilterDef(name="test", defaultCondition="other = 123") public class B implements Serializable{ @Id @Column(name = "A_REF") private int aRef; @Id @Column(name = "OTHER") private int other; } Session session = entityManager.unwrap(Session.class); session.enableFilter("test"); A a = entityManager.find(A.class, new Integer(0)) a.getb().size() //Only contains b that are equals to 123 

与JPA 1您可以使用提供的解决scheme,但更改解包getDelegate是这样的

 Session session = (Session)entityManager.getDelegate(); 

它会工作。

如果我正确地理解了这个问题,有一种方法可以用javax.persistence注解(我在ManyToOne自己使用这个方法,并从这里定制了答案):

 @JoinColumns({ @JoinColumn(name = "A_REF", referencedColumnName = "REF"), @JoinColumn(name = "B_TABLE_NAME.OTHER", referencedColumnName = '123')}) @OneToMany private Set<B> bs; 

请注意referencedColumnName中的引号,这是您正在查找的值。

对不起,我不知道我在哪里find这个解决scheme了。