Java 一对多的JPA

Java 一对多的JPA,java,hibernate,jpa,Java,Hibernate,Jpa,我有以下实体:事件和属性。一个事件可以有许多属性 我遇到的问题是,我似乎找不到在单个SQL查询中返回事件及其属性的查询。我可能有数百万个需要迭代的事件,我不想因为明显的性能原因而延迟加载它们 我尝试在查询中使用fetch,但它会为每个属性返回一个事件。i、 e.如果一个事件有两个属性,它将返回两个事件,每个事件有一个属性 我想要的是一个具有2个属性的事件 SELECT e FROM Event e LEFT JOIN FETCH e.attributes 如果我添加DISTINCT,它会工作,

我有以下实体:事件和属性。一个事件可以有许多属性

我遇到的问题是,我似乎找不到在单个SQL查询中返回事件及其属性的查询。我可能有数百万个需要迭代的事件,我不想因为明显的性能原因而延迟加载它们

我尝试在查询中使用fetch,但它会为每个属性返回一个事件。i、 e.如果一个事件有两个属性,它将返回两个事件,每个事件有一个属性

我想要的是一个具有2个属性的事件

SELECT e FROM Event e LEFT JOIN FETCH e.attributes
如果我添加DISTINCT,它会工作,但是它会创建一个DISTINCT SQL查询,这在大型数据集上非常慢

public class Event {
  @OneToMany(mappedBy = "event", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  public Set<Attribute> getAttributes(){}
}

public class Attribute {
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "event_id", nullable = false)
    public Event getEvent() {
        return event;
    }
}
需要注意的一件事是,我尝试使用未包装会话中的HQL。我向查询中添加了DISTINCT,并将结果转换器设置为DISTINCT\u ROOT\u实体,类似于上面的条件解决方案。这样做仍然会创建一个独特的SQL查询

您需要一个结果变压器

请尝试以下HQL:

SELECT DISTINCT e FROM Event e LEFT JOIN FETCH e.attributes

这相当于在条件查询中使用CriteriaSpecification.DISTINCT\u ROOT\u实体。

当我添加DISTINCT时,它正在创建一个非常慢的DISTINCT sql查询选择DISTINCT event0\u.id作为。。。。distinct覆盖了整个已经是distinct的结果,但检查速度很慢。。。我看不到使用JPA访问ResultTransformer的选项。您解决了这个问题吗?如果没有,请尝试初始化DistinctRootEntityResultTransformer,并将结果从HQL传递到transformListList方法中。是的,我为问题添加了解决方案。出于某种原因,HQL仍在生成一个独特的查询,但使用hibernate条件并设置结果转换器完成了这项工作。谢谢
SELECT DISTINCT e FROM Event e LEFT JOIN FETCH e.attributes