在Hibernate中建模可空组合外键?

时间:2018-08-22 00:57:39

标签: java mysql hibernate jpa

我有一个带有复合外键的数据类型。列之一可以为null,在这种情况下,这意味着没有要映射的外部实体(这是对树进行建模,因此元素是树的根)。如何将其存储在Hibernate中?

@Nullable
@ManyToOne(optional=true)
@JoinColumns({
    @JoinColumn(name="tree_id", referencedColumnName="tree_id"),
    @JoinColumn(name="parent_id", referencedColumnName="node_id", nullable=true),
})
public TreeNode getParent() {
    return parent;
}

每当尝试访问根节点时,此操作都会失败,表示无法找到具有该键的条目(我假设键为(tree_id, null),没有相应的条目)。

我正在使用HQL查询访问节点,如下所示:

@Query("from TreeNode as tn where tn.treeId = ?2 and tn.parent.treeId = ?1")

1 个答案:

答案 0 :(得分:0)

该问题很可能是由于您试图将 null = 运算符进行比较。在数据库中,您永远无法在 = 运算符的帮助下比较 null 。在本机查询中,也与进行了比较,而不是 =

因此,在这种情况下,等效的本地sql查询将类似于:

select [column list] from TreeNode as tn where tn.treeId = [treeId] and tn.parent.treeId = null;

由于两个null永远不能相等,这就是为什么查询不返回任何内容的原因。

在这种情况下,您可以根据parent.treeId的值使用查询。

如果parent.treeId的值为,那么只需触发以下查询即可:

@Query("from TreeNode as tn where tn.treeId = ?1")

,如果parent.treeId的值为不为空,则触发您已经在写的查询。