注释过滤@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了。
- JPA渴望获取不join
- Hibernate EnVers中的@NotAudited和RelationTargetAuditMode.NOT_AUDITED有什么区别?
- REST Web服务的身份validation
- hibernate/春季:未能懒惰地初始化 – 没有会议或会议被closures
- org.hibernate.MappingException:无法确定types:java.util.List,在表:College,for列:
- JPAhibernate多对多级联
- ORDER BY使用Criteria API
- Hibernate:拉取所有懒惰集合的最佳实践
- 使用Spring和Hibernate跨多个数据库进行分布式事务的“最佳”方式是什么?