如何在JPA中查询组合对象?

时间:2012-03-03 17:14:17

标签: java jpa jpql

我现在想要JPQL检索组合对象。 ObjectA具有ObjectB(聚合)。我可以查询没有与ObjectA链接的ObjectB。 NAtive Query将是这样的:

SELECT * FROM OBJECTB WHERE  ID_OBJECTA = NULL

有时JPA会创建一个关联实体,但我假设这里只添加了ID_OBJECTA作为其聚合器的引用。

感谢您的帮助。

Class ClassA{
public ClassB b;
}

ClassB{
public String data;

}

我知道我可以这样查询:

Select a from ClassA a join a.b bb//Given a retrieve b

我想这样做:

Select b from ClassB b join ...// ClassB doenst have an a Attribute

如何从ClassB查询ClassA

2 个答案:

答案 0 :(得分:0)

您想要的是双向一对一关联。在这种情况下,您有两种选择Lazily或Eagerly加载。除非您希望使用预先加载来覆盖延迟加载,否则都不需要在JQL中显式连接。这当然是基于这样一个事实,即定义这些对象之间关系的annotations / xml是正确设置的。

对于ClassA类型,您将需要ClassB中的属性来保持ClassB关系中的更改,而不依赖于ClassA。此属性还允许ClassB上的子查询使用数据(eager)或查询存根(lazy)填充父ClassA成员

public ClassA{
   ClassB Child;
}

public ClassB{
   ClassA parent;
   String data;
}

查看此wiki书籍条目,它将引导您完成此设置。 One To One 在处理PersonAddress时会产生一种非常类似的情况,并通过查询地址来确定如何获取此人。

注意:我刚刚读到你试图在没有关联的情况下这样做。像其他海报一样注意到它添加这种关系的微不足道,如果它的懒惰它几乎没有增加任何开销。我可以想到不这样做的唯一原因是一些误导性的尝试,以避免使用ClassA引用来污染classB。记住“更糟糕的是更好”简单 - >正确性 - >一致性 - >完整性。这是解决你问题的最简单方法,并不简单。

答案 1 :(得分:0)

如果没有从B到A的关联,您的第一个查询AFAIK就无法实现。您有这样的查询这一事实表明这种关联应该存在。

丑陋的解决方法是使用此查询:

select b from B b where b.id not in (select b.id from A a join a.b b)

其他查询可能不是您想要的查询:

select b from A a join a.b b where ...