Java 如何通过spring数据(jpql)获取与下一个其他对象相关的对象

Java 如何通过spring数据(jpql)获取与下一个其他对象相关的对象,java,hibernate,hql,spring-data-jpa,jpql,Java,Hibernate,Hql,Spring Data Jpa,Jpql,我将spring数据与JPQL分组选择一起使用,一切正常,统计数据都会被统计,但当我想要访问competition对象时,我会遇到以下错误: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 我有这些实体,我想收集统计数据 @Entity public class BetCourse { @ManyToOne(fetch = FetchType.LAZY) @J

我将spring数据与JPQL分组选择一起使用,一切正常,统计数据都会被统计,但当我想要访问competition对象时,我会遇到以下错误:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
我有这些实体,我想收集统计数据

@Entity
public class BetCourse {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MATCH_ID", nullable = false)
    private BetMatch betMatch;
}

@Entity
public class BetMatch {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "betMatch")
    private List<BetCourse> courses = new ArrayList<>();
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "COMPETITION_ID", nullable = false)
    private Competition competition;
}

@Entity
public class Competition {

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "competition")
    private List<BetMatch> betMatches = new ArrayList<>();
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "competition")
    private List<Stats> stats = new ArrayList<>();
}
通过此选项选择:

@Query("select new Stats(" +
            "c.course, " +
            "c.courseType, " +
            "count(*), " +
            "SUM(CASE WHEN win = true THEN 1 ELSE 0 END), " +
            "c.betMatch.competition) " +
            "from BetCourse c " +
            group by c.course, c.betMatch.competition, c.courseType")
    public List<Stats> computeStatsByBetShop();

我如何取回这个物体?是否有可能以某种方式与join fetch结合?

在创建了一些代码峰值之后,我提出了一个非常简单直接的解决方案。与从BetCourse表开始JPQL并从那里进行连接不同,您应该从Competition表开始,然后在BetCourse之前进行内部连接

这是因为从Beto的角度来看,这个实体是一个多实体,JPA不知何故迷失了方向。只要按相反的顺序做就可以解决你的问题

@Query("select new Stats(" +
        "c.course, " +
        "c.courseType, " +
        "count(c), " +
        "SUM(CASE WHEN win = true THEN 1 ELSE 0 END), " +
        "cpt) " +
        "from Competition cpt " +
        "inner join cpt.betMatches bm " +
        "inner join bm.courses c " +
        "group by c.course, c.courseType, cpt")
@ReadOnlyProperty
public List<Stats> computeStatsByBetShop();
@Query(“选择新统计信息(”+
“当然,”+
“c.courseType,”+
“伯爵(c),”+
求和(如果win=true,则为1,否则为0结束)+
“cpt”+
“来自竞争对手cpt”+
“内部联接cpt.bm”+
“内部连接bm.c”+
“按c.course、c.courseType、cpt分组”)
@只读属性
公共列表computeStatsByBetShop();
这里有一个GitHub跟踪您的类,所以您可以使用它作为示例,以防它仍然不适合您


干杯,Nikolas

当我使用此代码时,我得到了这一点:由:org.hibernate.QueryException:查询指定的联接获取,但获取的关联的所有者不在选择列表[FromElement]中{显式,不是集合联接,获取联接,获取非惰性属性,classAlias=bm,role=com.patientandrich.model.database.BetCourse.betMatch,tableName=bet\u match,tableAlias=betmatch1\u,origin=bet\u course betcourse0\u,columns={betcourse0.match\id,className=com.patientandrich.model.database.betMatch}]哎呀,我想我多放了一个join fetch。试着删除最后一个,让“join fetch c.betMatch bm”。我已经编辑了我的答案。如果它仍然不起作用,我会尝试在这里创建一些具有相同结构的最小项目,看看为什么它不起作用。但是你能先尝试一下这个小修复程序吗?我尝试了,但仍然有相同的错误:/当我想要获取多对一关系时,不应该有什么不同吗?@user1604064你能编辑你的问题吗,a为你的问题中涉及的部分设置一个最小的可执行实体?我试图在这里创建一个spike代码来自己执行它,但是你的帖子中缺少一些部分。然后我可以在github上创建一个示例代码并提供给你。Cheers@user1604064我刚刚编辑了我的答案,并向您提供了一个代码(在github中)这很有效,我自己也做了适当的测试。我希望现在它能解决你的问题。干杯
stat.getCompetition()
@Query("select new Stats(" +
        "c.course, " +
        "c.courseType, " +
        "count(c), " +
        "SUM(CASE WHEN win = true THEN 1 ELSE 0 END), " +
        "cpt) " +
        "from Competition cpt " +
        "inner join cpt.betMatches bm " +
        "inner join bm.courses c " +
        "group by c.course, c.courseType, cpt")
@ReadOnlyProperty
public List<Stats> computeStatsByBetShop();