Сложный JPQL-запрос, возвращающий 0 нулевых результатов.

0

Я работаю над приложением, где водители автобусов имеют групповые чаты с родителями детей на маршрутах, которые они обрабатывают.

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

Я пробовал этот запрос, но он всегда возвращает 0 результатов. Когда это обязательно должно быть возвращено хотя бы один.

1 | @Query("select g from GroupChat g " + 
2 |        "join g.route r " +
3 |        "join r.bus b " +
4 |        "join b.mostRecentStop mrs " +
5 |        "join r.stops s " +
6 |        "join s.children c " +
7 |        "where r.routeId = :routeId " +
8 |        "and s.stopTime <= mrs.stopTime " +
9 |        "and g.childId = c.childId ")
10|Set<GroupChat> getAllGroupChatsOnRouteForPreviousStops(@Param("routeId") short routeId);

GroupChats PK - routeId-childId

Строка 2 выбирает маршрут, с которым связан групповой вызов.
Строка 3 выбирает шину для этого маршрута.
В строке 4 выдается самая последняя остановка, на которой прибыла автобус.
Строка 5 выбирает все остановки на маршруте
Строка 6 выбирает всех детей на маршруте (т.е. каждый ребенок с каждой остановки)
Фильтры линии 7 только для запрошенного маршрута.
Фильтры линии 8 для остановок до самой последней остановки
Фильтры линии 9 только для групповых чатов для детей только на оставшихся остановках.

Что я делаю неправильно?

  • 0
    Добавьте spring.jpa.show-sql = true в application.properties. Теперь выполните этот запрос. Теперь вы сможете выполнять SQL-запросы в журнале приложений. Перейти к терминалу SQL и выполнить то же самое, заменив ? со значением routeId . Отладка запроса построчно с этого момента.
  • 0
    @MaruthiAdithya, так что я попробовал, и странно, результаты, которые я получаю, выполняя запрос на MySQL, не совпадают с результатами моего приложения.
Показать ещё 5 комментариев
Теги:
spring-boot
hibernate
spring-data-jpa
jpql

1 ответ

1
Лучший ответ

Поскольку это связано с сложным запросом в JPQL, лучше и рекомендуется использовать собственный запрос.

@Query(value="select g from GroupChat g  
              join g.route r  
              join r.bus b 
              join b.mostRecentStop
              join r.stops s
              join s.children c 
              where r.routeId = :routeId
              and s.stopTime <= mrs.stopTime
              and g.childId = c.childId",
              nativeQuery=true
      )
Set<GroupChat> getAllGroupChatsOnRouteForPreviousStops(@Param("routeId") short routeId);
  • 0
    Удалось удалить объединение с помощью собственного запроса и устранить проблему! благодарю вас!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню