如何通过 spring data(jpql) 获取与下一个其他对象相关的对象
How to fetch object via spring data(jpql) that is in relation via next other object
我正在使用带有 JPQL 分组 select 的 spring 数据,一切正常,统计数据也被计算在内,但是当我想访问竞争对象时,我收到了这个错误:
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<>();
}
我正在从这些 classes 中挖掘数据到 Stats class
@Entity
public class Stats {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMPETITION_ID", nullable = false)
private Competition competition;
}
通过这个 select:
@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 table 开始你的 JPQL,然后从那里开始连接,你应该从比赛 table 开始,然后进行内部连接直到 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 跟在您的 类 之后,因此您可以将其用作示例,以防它仍然不适合您。
干杯,尼古拉斯
我正在使用带有 JPQL 分组 select 的 spring 数据,一切正常,统计数据也被计算在内,但是当我想访问竞争对象时,我收到了这个错误:
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<>();
}
我正在从这些 classes 中挖掘数据到 Stats class
@Entity
public class Stats {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMPETITION_ID", nullable = false)
private Competition competition;
}
通过这个 select:
@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 table 开始你的 JPQL,然后从那里开始连接,你应该从比赛 table 开始,然后进行内部连接直到 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 跟在您的 类 之后,因此您可以将其用作示例,以防它仍然不适合您。
干杯,尼古拉斯