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



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

我的查询如下(摘录):

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;
     }
}

我一直在寻找某种不同的句子来应用于提取,但没有(无论如何都会有一个"补丁"…)

如果我更改

List<SecondFetch>

对于

Set<SecondFetch>

我会得到预期的结果,这要归功于Sets'Keys,所以我确实觉得这是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中设置不同的query最终会使用与Hibernate DISTINCT_ROOT_ENTITY相同的代码?

相关内容

  • 没有找到相关文章

最新更新