我有两个表之间的父/子关系,以及我的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
附加过滤器将只是列名和硬编码值。有没有一种方法可以使用hibernate注释?
我已经看过了@JoinFormula,但是我总是必须从父表中引用一个列名(在nameJoinFormula 的属性中)。
@JoinFormula
name
在此先感谢您的任何建议。
JPA不支持它,但是如果您将hibernate用作JPA提供程序,则可以使用批注@FilterDef和@Filter。
@FilterDef
@Filter
Hibernate Core参考文档 Hibernate3能够预定义过滤条件,并在类级别和集合级别附加这些过滤器。过滤条件允许您定义一个限制子句,该子句类似于类和各种集合元素上可用的现有“ where”属性。但是,可以对这些过滤条件进行参数化。然后,应用程序可以在运行时决定是否应启用某些过滤器以及其参数值应为什么。过滤器可以像数据库视图一样使用,但是它们在应用程序内部被参数化。
Hibernate Core参考文档
Hibernate3能够预定义过滤条件,并在类级别和集合级别附加这些过滤器。过滤条件允许您定义一个限制子句,该子句类似于类和各种集合元素上可用的现有“ where”属性。但是,可以对这些过滤条件进行参数化。然后,应用程序可以在运行时决定是否应启用某些过滤器以及其参数值应为什么。过滤器可以像数据库视图一样使用,但是它们在应用程序内部被参数化。
例子
@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