Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 过滤@OneToMany关联结果的注释_Java_Hibernate_Jpa_Jointable - Fatal编程技术网

Java 过滤@OneToMany关联结果的注释

Java 过滤@OneToMany关联结果的注释,java,hibernate,jpa,jointable,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_RE

我有两个表之间的父/子关系,以及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 = ? and other = 123
附加的过滤器将只是一个列名和一个硬编码的值。有没有办法使用hibernate注释来实现这一点

我已经看过了
@JoinFormula
,但是我总是要引用父表中的列名(在JoinFormula的
name
属性中)


提前感谢您的建议。

JPA不支持它,但如果您使用hibernate作为JPA提供商,则可以使用annotation
@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
@实体
公共类A实现可序列化{
@身份证
@列(name=“REF”)
私有int-ref;
@独身癖
@JoinColumn(name=“A_REF”,referencedColumnName=“REF”)
@过滤器(name=“test”)
私有集bs;
}
@实体
@FilterDef(name=“test”,defaultCondition=“other=123”)
公共类B实现可序列化{
@身份证
@列(name=“A_REF”)
私人国际机场;
@身份证
@列(name=“其他”)
私人或其他;
}
Session Session=entityManager.unwrap(Session.class);
会话.启用筛选器(“测试”);
A=entityManager.find(A.class,新整数(0))
a、 getb().size()//只包含等于123的b

对于JPA 1,您可以使用提供的解决方案,但将unwrap更改为getDelegate,使其类似于此

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

如果我正确理解了这个问题,有一种方法可以通过javax.persistence注释实现这一点(我自己在多个One上使用了它,并根据以下内容定制了答案):

@JoinColumns({
@JoinColumn(name=“A_REF”,referencedColumnName=“REF”),
@JoinColumn(name=“B_TABLE_name.OTHER”,referencedColumnName=“'123'))
@独身癖
私有集bs;
请注意referencedColumnName中的单引号,这是您要查找的值


更多信息。

另一个解决方案是使用Hibernate的@Where:

@OneToMany
@JoinColumn(name=“A_REF”,referencedName=“REF”)
@其中(第条=“其他=123”)
私有集bs;

谢谢,效果很好。不过,您必须动态启用它(我将始终启用它),这有点烦人。我会接受的!entityManager上没有上行方法:(对不起,它只在JPA 2.0之后才可用。也许这不正确,但从我所读到的内容来看,这似乎是应用程序过滤器,而不是where条件的补充,是吗?奇怪的是,为什么不把它作为参数传入呢?
其中a_ref=?和other=?
。传入的值可以硬编码,如果您需要这样做的话(我建议使用可配置的属性系统)。
Session session = (Session)entityManager.getDelegate();
@JoinColumns({
    @JoinColumn(name = "A_REF", referencedColumnName = "REF"),
    @JoinColumn(name = "B_TABLE_NAME.OTHER", referencedColumnName = "'123'")})
@OneToMany
private Set<B> bs;
    @OneToMany
    @JoinColumn(name = "A_REF", referencedName = "REF")
    @Where(clause = "other = 123")
    private Set<B> bs;