我遇到一些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
)