Java Fetch联接返回的行数超过了它们应该返回的行数

Java Fetch联接返回的行数超过了它们应该返回的行数,java,oracle,jpa,jpa-2.0,jpql,Java,Oracle,Jpa,Jpa 2.0,Jpql,我在做一些连接时遇到了一个奇怪的问题。简言之,如果我做左连接,我会得到正确的行数。如果我执行左连接获取,我将获得比预期更多的行 我的实体类是(为简洁起见,使用伪代码) 公共一级{ ... 二等兵; } 公共二班{ ... 私人三人组; } 公共三班{ ... } 在我的关系中,一班有四个二,二班有九个三 我原以为一班有四个二,一班有九个三 如果我使用 List<One> res = em.createQuery("select o from One o left join o.tw

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

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

公共一级{
...
二等兵;
}
公共二班{
...
私人三人组;
}
公共三班{
...
}
在我的关系中,一班有四个二,二班有九个三

我原以为一班有四个二,一班有九个三

如果我使用

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)
List res=em.createQuery(“从一个o左连接o.twos t左连接t.threes中选择o,其中o.id=322”,One.class.).getResultList();
List twos=resultList.get(0.getTwos()//结果为四个二-正确
List res=em.createQuery(“从一个o左连接中选择o获取o.twos t左连接t.threes,其中o.id=322”,One.class.).getResultList();
List twos=resultList.get(0.getTwos()//结果为四个二-正确
List res=em.createQuery(“从一个o左连接获取o.twos t左连接获取0.threes中选择o,其中o.id=322”,One.class.).getResultList();
List twos=resultList.get(0.getTwos()//结果是30个尺寸为2的-*不正确*(是4*9)
为什么第二次取数会导致它成倍增加。我的数据库存在性能问题,因此希望进行fetch连接以尝试改进它们。通过抓取,我似乎得到了比预期多得多的结果

我使用oraclexe作为我的数据库,使用JPA2/hibernate作为我的ORM


谢谢

根据@JB Nizet的评论,我在我的层级结构中发现了一个虚假的列表。要解决这个问题,您需要确保所有内容都使用集合。如果您有多个列表,您将收到关于无法获取多个行李的JPA错误。如果你有一个列表,你不会,但你最终会得到重复的列表,你确定集合是集合,而不是列表吗?你的类
one
Two
Two
是否正确地实现了
equals()
hashCode()
?啊哈!谢谢你。我把这个简化得太多了,因为结构要复杂得多。当我翻阅它时,我发现了一个虚假的列表,应该是一套!感谢这是hibernate特有的问题,而不是JPA。再见,谢谢。。对我来说学习很好
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)