java - 用于过滤 @OneToMany 关联结果的注释

标签 java hibernate jpa jointable

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

提前感谢您的任何建议。

最佳答案

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

Hibernate Core Reference Documentation

Hibernate3 has the ability to pre-define filter criteria and attach those filters at both a class level and a collection level. A filter criteria allows you to define a restriction clause similar to the existing "where" attribute available on the class and various collection elements. These filter conditions, however, can be parameterized. The application can then decide at runtime whether certain filters should be enabled and what their parameter values should be. Filters can be used like database views, but they are parameterized inside the application.

示例

@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

关于java - 用于过滤 @OneToMany 关联结果的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6919686/

相关文章:

java - 我的函数的复杂性是多少?

java - 如何在 Spring 创建一个新 session ?

java - Apache CXF geronimo-servlet_3.0_spec-1.0.jar - 未加载具有 Tomcat servlet jar 的 jar

java - Hibernate 和 Java - 映射相似的列

java - 如何将 Hibernate 从 jboss-logging 切换到 logback?

java - Hibernate 3.5.0-CR-2版本是否支持JPA2.0

java - 如何将此 lambda 表达式转换为方法引用

java - Hibernate with HSQL - 在 Tomcat 上启动应用程序时未创建表

java - 部署到 Jboss 7.1.0 EAP 时未指定持久性单元名称错误

java - 如何告诉 EclipseLink 在 SQL 中使用完整的表名称作为别名