由于外键值为空,因此无法从表中获取数据

时间:2018-12-17 07:17:52

标签: java mysql sql spring-boot

我正在使用mysql数据表和SQL查询来获取数据,我从两个表中进行选择,这些表由一对多和多对一的关系联接,但是如果映射表没有任何值,那么我什至无法获得我选择的表的值。但是,当我放置外键时,它可以正常工作,并且我是两个表的数据。

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

这是我的SQL查询,当recipeUser为null时,尽管具有Layerdetails的值,但我没有任何值。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我通过LEFT JOIN而不是简单的JOIN解决了这个问题。


[INNER] JOIN -仅返回两个表中匹配的记录
完全联接-返回两个表中的记录。如果没有匹配项,则缺少的一面将为空。
左联接-返回左侧表中的所有记录,并在右侧表中返回匹配的记录(如果有)。
RIGHT JOIN -返回右侧表中的所有记录,并在左侧表中找到匹配的记录(如果有)。

Explanation Venn diagram

您可以查看Visual Representation of SQL Joins以获得更多详细信息。

答案 1 :(得分:1)

之所以会发生这种情况,是因为此处的JOIN是一个内部联接(如果不使用特定联接,则为默认联接)。内部联接对LayerDetailsRecipeUser的元组进行迭代。但是,由于在您的情况下,字段recipeUsernull,因此对于LayerDetails的实例,它没有元组。因此,要查找没有LayerDetails的{​​{1}}实例,则需要改用recipeUser

LEFT JOIN

如果您想了解有关JPA中不同@Query("SELECT LD,REC FROM LayerDetails LD LEFT JOIN LD.recipeUser REC") public List getLayerDetails(); 可能性的更多信息,例如,可以看看https://www.objectdb.com/java/jpa/query/jpql/from