JPQL - 如何通过子实体中定义的关系而不是查询根来加入

时间:2015-02-24 17:53:28

标签: hibernate jpql

我遇到一些JPQL查询问题。我有一个Root对象,在Root的关系OneToMany中有许多类。不幸的是,在这个遗留代码中,我还有一个Leaf类,其关系被描述为Root作为ManyToOne。我想对这些对象进行过滤。由于我动态构建查询,并不总是需要Leaf,并且在许多情况下对于给定的Root不存在,我不想更改查询的根。

由于它是没有任何实际测试套件的遗留代码,我不喜欢在Root类中创建镜像关系。

我尝试了类似" FROM Root left join"希望,hibernate能够足够聪明地知道这些类的关系,但我错了。有关如何实现这一目标的任何帮助吗?


编辑:

我无法输入实际代码,但它看起来如下所示。当我看到它时,它不是关于ManyToOne加入JPQL,而是加入来自子实体的关系定义而不是根实体。

@Entity
class Root{
    @OneToMany
    SomeLeaf someLeaf;

    @ManyToOne
    OtherLeaf otherLeaf;    
}


@Entity
class SomeLeaf{
    String someProperty;
}


@Entity
class OtherLeaf{
    String otherProperty;
}


@Entity
class DifferentLeaf{
    @ManyToOne
    Root root;

    String differentProperty;
}

我想发送的查询就是这样的。是否只是将OtherLeaf关系移动到子查询?

select
    r
from
    Root root
    left join r.someLeaf someLeaf
    left join DifferentLeaf differentLeaf
where
    someLeaf.someProperty = 'someValue'
    and otherLeaf.otherProperty = 'otherValue'
    and (
         differentLeaf.differentProperty = 'differentValue'
         or differentLeaf not exists
    )

0 个答案:

没有答案