Spring Repository: возвращает тот же список результатов, несмотря на изменение параметра - PullRequest
1 голос
/ 31 января 2020

У меня есть служба 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)
    {
        ...
    }
}

Но моя проблема заключается в следующем:

ResultSet для «ratingNow» и «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);

1 Ответ

0 голосов
/ 31 января 2020

Вы уже распечатали запрос, который выполняется?
По моему мнению, ему не передано правильное значение 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);

См. эту статью о Baeldung в качестве ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...