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

标签 java hibernate hql spring-data-jpa jpql

我将 spring 数据与 JPQL 分组选择一起使用,一切正常,统计数据也被计算在内,但是当我想访问竞争对象时,我收到了这个错误:

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

我正在从这些类中挖掘数据到 Stats 类

@Entity
public class Stats {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "COMPETITION_ID", nullable = false)
    private Competition competition;
}

通过这个选择:

@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();

当我访问竞争对象时

stat.getCompetition()

我怎样才能获取这个对象?是否有可能以某种方式与 join fetch 结合?

最佳答案

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

这是因为从 BetCourse 的角度来看,该实体是一个 ManyToOne,而它们的 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();

这里有一个 GitHub minimum code跟随你的类(class),所以你可以用它作为例子,以防它仍然不适合你。

干杯,尼古拉斯

关于java - 如何通过与下一个其他对象相关的 spring 数据(jpql)获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40699000/

相关文章:

JavaFX 缩放图表系列单位

JavaFX SceneBuilder 2 相对路径异常

grails - Grails-CreateCriteria检索包含查询中任何元素的任何条目

java - 使用 mockito 模拟使用通配符返回泛型的方法

java - 如何在 JDBC 中使用 Mysql 行构造函数进行查询?

java - Hibernate:在级联删除项目时清理集合的二级缓存

java - JPA - 批量/批量更新 - 更好的方法是什么?

java - Hibernate 数据检索改进。

java - 间接 Hibernate/JPA 方法调用丢失事务

java - 如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java 配置