Я использую таблицу данных mysql и SQL-запрос для получения данных, я выбираю из двух таблиц, соединенных отношениями один ко многим и многие к одному, но если сопоставленная таблица не имеет никакого значения, я не получаю даже значения таблица, которую я выбираю. Но когда я помещаю внешний ключ, он работает нормально, и я являюсь данными обеих таблиц.
@Query("SELECT LD,REC FROM LayerDetails LD JOIN LD.recipeUser REC")
public List getLayerDetails();
Это мой SQL-запрос, когда recipeUser имеет значение null, тогда, несмотря на наличие значения Layerdetails, я не получаю никаких значений.
Я столкнулся с той же проблемой. Я решил это с помощью LEFT JOIN
вместо простого JOIN
.
[ВНУТРЕННЕЕ СОЕДИНЕНИЕ - возвращает только записи, совпадающие в обеих таблицах.
ПОЛНОЕ СОЕДИНЕНИЕ - возвращает записи в обеих таблицах. Если совпадений нет, отсутствующая сторона будет содержать ноль.
ВЛЕВО ПРИСОЕДИНИТЬСЯ - возвращает все записи из левой таблицы с соответствующими записями в таблице справа (если доступно).
ПРАВО ПРИСОЕДИНИТЬСЯ - возвращает все записи из правой таблицы с соответствующими записями в таблице слева (если доступно).
Вы можете просмотреть Визуальное представление соединений SQL для более подробной информации.
Это происходит потому, что здесь 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.
Спасибо, Евгений, отлично работает после использования LEFT JOIN.