java - 在 Hibernate 中建模可为空复合外键?

标签 java mysql hibernate jpa

我有一个带有复合外键的数据类型。其中一列可以为空,在这种情况下,这意味着没有要映射到的外部实体(这是对树进行建模,因此该元素是树的根)。我如何将其存储在 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/

相关文章:

java - 使用 Logback 登录到系统输出的 Websphere - 格式问题

java - CardLayout 约束适用于 Windows,但不适用于 OS X

mysql - 从表的每一行中检索每列的每个属性 mysql java

hibernate - 获取一个懒惰的一对多列表的 child

java - JPA 一对多和多对一 : Error NULL not allowed for column

java - 创建实体后 Spring Hibernate 异常

java - Glassfish - 无法更新 http 端口。服务器关闭

java - 在 Eclipse 中从 CVS 部署项目时出错

使用 mysqldump.exe 进行 MySQL 完整备份

mysql - 两列SQL共存