我有一个具有以下功能的SpringBoot服务:
public class RankingService
{
public List<RankingDto> getIncrementralChanges(Double now, Double before)
{
List<RankingDto> rankingNow = createRanking(now);
List<RankingDto> rankingBefore = createRanking(before);
return getChanges(rankingNow, rankingBefore);
}
private List<RankingDto> createRanking(Double time)
{
return this.rankingRepo.findByTime(time)
.stream()
.map(e -> modelMapper.map(e, RankingDto.class))
.collect(Collectors.toList());
}
private List<RankingDto> getChanges(List<RankingDto> l1, List<RankingDto> l2)
{
...
}
}
但是我的问题如下:
“ rankingNow”和“ rankingBefore”的结果集完全相同! 我在日志文件中注意到,正确的值将在sql查询中绑定,所以我不知道为什么结果集相同。
如果我手动调用数据库中的两个查询,则会看到两个结果集中的差异。
在我看来,即使在日志文件中看起来也有缓存或其他任何东西插入,两个查询都被真正调用了。
如果我调用存储库的某些本机函数,例如findById(10)和findById(11),结果集有所不同,但是对于我的自定义查询却没有。
这是查询:
@Query(value = "SELECT r FROM Ranking JOIN r.team t JOIN t.starter s WHERE totalTime <= ?1")
@EntityGraph(attributePath = {"team", "team.starters"})
List<Ranking> findByTime(Double time);
答案 0 :(得分:0)
您已经打印了执行的查询吗?
我认为该值未传递time
的正确值。
要使用@Query
进行自定义查询,您应按位置或名称来引用参数,如下所示(请注意,方法参数的索引从1开始):
@Query(value = "SELECT r FROM Ranking JOIN r.team t JOIN t.starter s WHERE totalTime <= ?1")
List<Ranking> findByTime(Double time);
或按名称:
@Query(value = "SELECT r FROM Ranking JOIN r.team t JOIN t.starter s WHERE totalTime <= :time")
List<Ranking> findByTime(Double time);
请参见this article on Baeldung作为参考。