null

Список заполненных null объектов в подарок от Spring Data JPA

Добрый день. В этой короткой заметке приведу решение проблемы на которую за последние несколько лет натыкаюсь уже не первый раз. Чудесным прекрасным осенним зимним днём я написал запрос к БД, который должен возвращать список элементов типа X.  Код выглядел следующим образом.

 

@Query("SELECT x FROM Y y LEFT JOIN y.x x")

List<X> doSomeRequestToDatabase();

 

Я упростил этот запрос, но суть осталась. Конечно же он был размером с несколько этажей, парочка условий, несколько фетчей и прочего любимого. Программа компилируется, всё работается. Данные используется в несовсем тривиальной функции, а потом отбражаются в виде упоротой структуры (группируются с другим набором, и показываются ввиде дерева). Я довольно ухожу пить чай и есть печенье.

 

На следующий день выясняется, что в интерфейс падает с NPE. Я иду смотреть в чём может быть проблема. В ходе отладки выясняется, что список возвращаемый функцией содержит объекты у которых все поля null. При этом беглый взгляд на достаточно большой запрос не позволяет увидеть никакой проблемы. В чём же заключалась проблема? Проблема как всегда заключалась в очень глупой ошибке - неправильном использовании JOIN'ов. Если внимательно посмотреть на запрос, то станет видно, что возвращаемой сущностью из базы данных является x, но при этом x находится в правой части left outer join'а. Конкретно в моём примере необходимо было лишь изменить LEFT JOIN на INNER JOIN. Из-за left join'а. сущности Y, у которых не была заполнено в БД поле x попадали в результатирующий список запросов, и при этом все поля класса проставлялись в null. Исправленный вариант функции вы можете видеть ниже.

 

@Query("SELECT x FROM Y y INNER JOIN y.x x")

List<X> doSomeRequestToDatabase();

 

На этом, пожалуй, откланяюсь. Давайте не будем наступать на SQL грабли.