Не удается получить данные из таблицы из-за нулевого значения внешнего ключа

Я использую таблицу данных mysql и SQL-запрос для получения данных, я выбираю из двух таблиц, соединенных отношениями один ко многим и многие к одному, но если сопоставленная таблица не имеет никакого значения, я не получаю даже значения таблица, которую я выбираю. Но когда я помещаю внешний ключ, он работает нормально, и я являюсь данными обеих таблиц.

@Query("SELECT LD,REC FROM LayerDetails LD JOIN LD.recipeUser REC")
public List getLayerDetails();

Это мой SQL-запрос, когда recipeUser имеет значение null, тогда, несмотря на наличие значения Layerdetails, я не получаю никаких значений.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
250
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я столкнулся с той же проблемой. Я решил это с помощью LEFT JOIN вместо простого JOIN.


[ВНУТРЕННЕЕ СОЕДИНЕНИЕ - возвращает только записи, совпадающие в обеих таблицах.
ПОЛНОЕ СОЕДИНЕНИЕ - возвращает записи в обеих таблицах. Если совпадений нет, отсутствующая сторона будет содержать ноль.
ВЛЕВО ПРИСОЕДИНИТЬСЯ - возвращает все записи из левой таблицы с соответствующими записями в таблице справа (если доступно).
ПРАВО ПРИСОЕДИНИТЬСЯ - возвращает все записи из правой таблицы с соответствующими записями в таблице слева (если доступно).

Explanation Venn diagram

Вы можете просмотреть Визуальное представление соединений SQL для более подробной информации.

Спасибо, Евгений, отлично работает после использования LEFT JOIN.

Ayan Misra 17.12.2018 08:29

Это происходит потому, что здесь JOIN является внутренним соединением (которое используется по умолчанию, если вы не используете конкретное соединение). Внутреннее соединение перебирает кортежи LayerDetails и RecipeUser. Однако, поскольку поле recipeUser в вашем случае является null, у него нет кортежа для этого экземпляра LayerDetails. Таким образом, чтобы также найти экземпляры LayerDetails, у которых нет recipeUser, вам нужно будет вместо этого использовать LEFT JOIN.

@Query("SELECT LD,REC FROM LayerDetails LD LEFT JOIN LD.recipeUser REC")
public List getLayerDetails();

Если вы хотите получить больше информации о различных возможностях JOIN в JPA, вы можете, например, взглянуть на https://www.objectdb.com/java/jpa/query/jpql/from.

Другие вопросы по теме