获取连接返回的行数超出应有的数量

时间:2013-07-19 08:51:45

标签: java oracle jpa jpa-2.0 jpql

我遇到了一些我正在做的连接的奇怪问题。简而言之,如果我执行左连接,我会获得正确的行数。如果我执行左连接提取,我会获得比预期更多的行。

我的实体类是(为简洁起见使用伪代码)

public class One {
   ...
   private Set<Two> twos;
}

public class Two {
   ...
   private Set<Three> threes;
}

public class Three {
   ...
}

在我的关系中,我在班级一个中有四个两个,每个班级中有九个三个 两个

我原本期待已经退回一个一级,一个四个,两个,每个两个九个三分。

如果我使用

,我会得到这个
List<One> res = em.createQuery("select o from One o left join o.twos t left join t.threes where o.id = 322", One.class).getResultList();
List<Two> twos = resultList.get(0).getTwos(); //results in four twos - CORRECT

List<One> res = em.createQuery("select o from One o left join fetch o.twos t left join t.threes where o.id = 322", One.class).getResultList();
List<Two> twos = resultList.get(0).getTwos(); //results in four twos - CORRECT

List<One> res = em.createQuery("select o from One o left join fetch o.twos t left join fetch.threes where o.id = 322", One.class).getResultList();
List<Two> twos = resultList.get(0).getTwos(); //results in thirty size twos - *INCORRECT* (is four * nine)

为什么第二次提取会导致它成倍增加。我的数据库存在性能问题,所以想要获取连接以尝试改进它们。通过提取虽然我似乎有比预期更多的结果。

我使用Oracle XE作为我的数据库,使用JPA2 / hibernate作为我的ORM。

由于

1 个答案:

答案 0 :(得分:0)

根据@JB Nizet的评论,我在我的层次结构中发现了一个虚假的列表。要解决这个问题,您需要确保所有内容都使用集合。如果您有多个列表,则会收到有关无法获取多个行李的的JPA错误。如果你有一个列表,你不会,但你最终得到重复