用于筛选@OneToMany关联的结果的批注

2022-09-01 20:41:39

我在两个表之间有父/子关系,在我的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

附加筛选器将只是一个列名和一个硬编码值。有没有办法使用休眠注释来做到这一点?

我已经看过了,但我总是必须从父表中引用列名(在JoinFormula的属性中)。@JoinFormulaname

提前感谢您的任何建议。


答案 1

JPA 不支持它,但是如果您使用休眠作为 JPA 提供程序,则可以使用注释和 .@FilterDef@Filter

休眠核心参考文档

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

答案 2

使用JPA 1,您可以使用提供的解决方案,但更改解包以获得Delegate成为那样

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

它会起作用的。


推荐