编程语言
首页 > 编程语言> > java – jpa条件查询获取列表中的重复值

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

作者:互联网

当我使用条件查询获取list属性时,我正在观察我认为JPA 2中的意外行为.

我的查询如下(它的摘录):

CriteriaBuilder b = em.getCriteriaBuilder();
CriteriaQuery<MainObject> c = b.createQuery(MainObject.class);
Root<MainObject> root = c.from(MainObject.class);
Join<MainObject, FirstFetch> firstFetch = (Join<MainObject, FirstFetch>) root.fetch(MainObject_.firstFetch);
firstFetch.fetch(FirstFetch_.secondFetch); //secondFetch is a list
c.select(root).distinct(true);

(所以,假设我将列表作为对象属性的属性.)

问题是当查询返回多个结果时,secondFetch值会在返回行时重复多次.每个firstFetch应该只有一个secondFetch但是有n代替.
我在这种情况下看到的唯一特殊性是所有MainObjects恰好具有相同的FirstFetch实例.
所以我的猜测是正在交叉连接,这是正常的,但是JPA无法将其secondFetch对象分配给firstFetch中的每一个.

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

@Entity
@Table(name="mainobject")
public class MainObject{
   //...
   private FirstFetch firstFetch;

   @ManyToOne(fetch=FetchType.LAZY)
   @JoinColumn(name="mainObject_column")
   public FirstFetch getFirstFetch() {
    return firstFetch;
   }
}

@Entity
@Table(name="firstFetch")
public class FirstFetch{
   //...
   private List<SecondFetch> secondFetch;

   @OneToMany(mappedBy="secondFetch")
   public List<SecondFetch> getSecondFetch() {
      return secondFetch;
   }
}

&安培;最后

@Entity
@Table(name="secondFetch")
public class SecondFetch {
    //....
    private FirstFetch firstFetch; //bidirectional

     @ManyToOne
     @JoinColumn(name="column")
     public FirstFetch getFirstFetch() {
        return firstFetch;
     }
}

我一直在寻找适用于fetch的某种不同的句子但是没有(无论如何都会是’补丁’……)

如果我改变了

List<SecondFetch>

对于

Set<SecondFetch>

由于Sets’Key,我会得到预期的结果,所以我觉得这在JPA的列表中是一种不当行为.

不过,我不是专家,所以我可以完美地在映射或查询中犯一些错误.
任何反馈都非常欢迎帮助清除这一点.
谢谢.

解决方法:

虽然我使用JPA标准API来执行查询,但我遇到了完全相同的问题.

经过一些研究后,我找到了一个你已经提到的解决方案(但由于你没有使用标准API而无法使用):使用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); 

不使用query.distinct(true);结果集乘以secondFetch列表中的对象数量.

Hibernate确实有类似DISTINCT_ROOT_ENTITY的东西,这听起来比仅设置查询更加清晰.但我没有进一步调查过这个问题.我也使用Hibernate作为JPA提供程序.也许在JPA中设置查询不同最终使用与Hibernates DISTINCT_ROOT_ENTITY相同的代码?

标签:java,jpa,list,criteriaquery
来源: https://codeday.me/bug/20190630/1334332.html