我有一个带有复合外键的数据类型。其中一列可以为空,在这种情况下,这意味着没有要映射到的外部实体(这是对树进行建模,因此该元素是树的根)。我如何将其存储在 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")
最佳答案
该问题很可能是由于您尝试将 null 与 = 运算符进行比较。在数据库中,您永远无法借助 = 运算符来比较 null。在 native 查询中,null 也是与 is 进行比较,而不是与 = 进行比较。
因此,在这种情况下,等效的 native SQL 查询将类似于:
select [column list] from TreeNode as tn where tn.treeId = [treeId] and tn.parent.treeId = null;
由于两个 null 永远不可能相等,这就是为什么您的查询不会返回任何内容。
在这种情况下,您可以根据parent.treeId的值进行查询。
假设如果parent.treeId的值为null,则只需触发以下查询:
@Query("from TreeNode as tn where tn.treeId = ?1")
如果parent.treeId的值不为空,则触发您已经编写的查询。
关于java - 在 Hibernate 中建模可为空复合外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958550/