23

我有两个表之间的父/子关系,以及我的 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,但我总是必须从父表中引用列名(在nameJoinFormula 的属性中)。

提前感谢您的任何建议。

4

4 回答 4

32

JPA 不支持它,但如果您使用 hibernate 作为 JPA 提供程序,那么您可以使用注解@FilterDef@Filter.

Hibernate 核心参考文档

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
于 2011-08-03T01:56:16.667 回答
2

使用 JPA 1,您可以使用提供的解决方案,但将 unwrap 更改为 getDelegate 就像那样

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

它会起作用的。

于 2015-02-26T11:25:52.747 回答
1

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

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

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

更多信息在这里

于 2016-10-14T07:35:27.837 回答
1

另一种解决方案是使用 Hibernate 的@Where:https ://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#pc-where

    @OneToMany
    @JoinColumn(name = "A_REF", referencedName = "REF")
    @Where(clause = "other = 123")
    private Set<B> bs;
于 2020-01-22T14:21:08.373 回答