Java jpa条件查询获取列表中的重复值

Java jpa条件查询获取列表中的重复值,java,list,jpa,criteriaquery,Java,List,Jpa,Criteriaquery,在JPA2中,当使用条件查询获取列表属性时,我观察到了我认为是意外的行为 我的问题如下(摘录): CriteriaBuilder b=em.getCriteriaBuilder(); CriteriaQuery c=b.createQuery(MainObject.class); Root=c.from(MainObject.class); Join firstFetch=(Join)root.fetch(MainObject.firstFetch); firstFetch.fetch(firs

在JPA2中,当使用条件查询获取列表属性时,我观察到了我认为是意外的行为

我的问题如下(摘录):

CriteriaBuilder b=em.getCriteriaBuilder();
CriteriaQuery c=b.createQuery(MainObject.class);
Root=c.from(MainObject.class);
Join firstFetch=(Join)root.fetch(MainObject.firstFetch);
firstFetch.fetch(firstFetch\uuuu.secondFetch)//secondFetch是一个列表
c、 选择(根).distinct(真);
(假设我正在获取一个列表作为对象属性的属性。)

问题是,当查询返回多个结果时,secondFetch值的重复次数与返回的行数相同。每个firstFetch应该只有一个secondFetch,但却有n。 我在本例中看到的唯一特殊性是,所有main对象碰巧都有相同的FirstFetch实例。 所以我猜连接被交叉了,这是正常的,但是JPA没有将它的secondFetch对象分配给每个FirstFetch对象

映射不应该太特殊,它们或多或少都是这样的

@实体
@表(name=“mainobject”)
公共类主对象{
//...
私人先取先取;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“mainObject\u column”)
public FirstFetch getFirstFetch(){
返回firstFetch;
}
}

@实体
@表(name=“firstFetch”)
公共类优先获取{
//...
私有列表获取;
@OneToMany(mappedBy=“secondFetch”)
公共列表getSecondFetch(){
返回二次提取;
}
}
&最后

@实体
@表(name=“secondFetch”)
公共类二次提取{
//....
private FirstFetch FirstFetch;//双向
@许多酮
@JoinColumn(name=“column”)
public FirstFetch getFirstFetch(){
返回firstFetch;
}
}
我一直在寻找某种类型的不同的语句来应用于提取,但没有(无论如何都会有一个“补丁…”)

如果我改变

列表
为了

Set
多亏了Sets的
,我才能得到预期的结果,所以我确实觉得这是JPA列表中的一种不当行为

不过,我不是专家,所以我很可能在映射或查询中犯了一些错误。 欢迎任何反馈来帮助解决这个问题。
谢谢。

尽管我使用JPA criteria API进行查询,但我遇到了完全相同的问题

经过一些研究,我找到了一个您已经提到的解决方案(但不可用,因为您没有使用CriteriaAPI):使用
distinct

根据JPA标准,它将如下所示:

CriteriaQuery<FirstFetch> query = cb.createQuery(FirstFetch.class);
Root<AbschnittC> root = query.from(FirstFetch.class);
root.fetch(FirstFetch_.secondFetch, JoinType.LEFT);
query.distinct(true); 
CriteriaQuery=cb.createQuery(FirstFetch.class);
Root=query.from(FirstFetch.class);
root.fetch(FirstFetch..secondFetch,JoinType.LEFT);
query.distinct(true);
不使用
query.distinct(true)结果集乘以
secondFetch
列表中的对象数量


Hibernate确实有类似于
DISTINCT\u ROOT\u ENTITY
的功能,这听起来比只设置一个DISTINCT查询更合适。但我没有对此进行进一步调查。我还使用Hibernate作为JPA提供者。也许在JPA中设置
查询
distinct会使用与Hibernates
distinct\u ROOT\u ENTITY
相同的代码?

您使用的JPA提供者是什么?可能是个bug。我使用的是JBoss 6.1.0的默认提供程序,如果我没有错的话,它将是Hibernate 3.6.6 Final。我遇到了完全相同的问题。我正在使用CriteriaAPI获取(第二个)列表,如下所示:d.fetch(FirstFetch\uux.secondFetch,JoinType.LEFT);感谢您的反馈,我将查看这个独特的_ROOT_实体并尽快更新您的示例只执行一次fetch();我认为这和上面所描述的不一样。