java - JPA - 具有 OR 条件的 OneToMany

标签 java hibernate jpa one-to-many

我有 2 个 SQL 表,“节点”和“边缘”。

“node”表有一个复合主键,由两列组成:“id”和“type”。

“边缘”表包含以下列:

  • node_1_id:边的第一个节点的id
  • node_1_type:边的第一个节点的类型
  • node_2_id:边的第二个节点的id
  • node_2_type:边的第二个节点的类型

还有两个外键约束将(“node_1_id”、“node_1_type”)和(“node_2_id”、“node_2_type”)链接到“node”表的“id”和“type”。

我创建了以下 jpa 实体:

@Entity
@Table(name = "edge")
public class Edge {
    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(name = "description", nullable = true, length = 100)
    private String description;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "node_1_id", referencedColumnName = "id"),
        @JoinColumn(name = "node_1_type", referencedColumnName = "type")
    })
    private Node node1;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "node_2_id", referencedColumnName = "id"),
        @JoinColumn(name = "node_2_type", referencedColumnName = "type")
    })
    private Node node2;
}

在“Node”实体中,我想创建一个名为“edges”的“OneToMany”关系,它获取链接到节点的所有边(无论它是第一个节点还是第二个节点)。

这是对应的SQL查询:

select *
from node n join edge e
on (n.id = e.node_1_id and n.type = e.node_1_type) or (n.id = e.node_2_id and n.type = e.node_2_type)
where n.id = 1 and n.type = 'type';

如何创建这样的关系?

最佳答案

是否必须是单个 @OneToMany 关系?否则,您可以将对应项添加到两个 @ManyToOne 关系中,并创建一个仅返回单个合并列表的 getter:

public class Node {

    @OneToMany(mappedBy="node1")
    private List<Edge> firstNodeEdges;

    @OneToMany(mappedBy="node2")
    private List<Edge> secondNodeEdges;

    public List<Edge> getEdges() {
        return Stream.concat(firstNodeEdges.stream(), secondNodeEdges.stream())
            .collect(Collectors.toList());
    }
}

关于java - JPA - 具有 OR 条件的 OneToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62083357/

相关文章:

java - 级联 ="all-delete- orphan"不再被引用

java - IntelliJ 对我来说太聪明了

java - JPA OneToMany MappedBy 关系

java - java中按类字段对数组进行排序

java - 将 JSON 子对象属性绑定(bind)到 Jackson 中的 Java 对象字段

java - 每当我注销服务器时命令就会停止

mysql - 将三个 derby 数据库迁移到一个 MySQL 数据库

java - hibernate - 如何 JoinColumn 一个 EmbeddedId

java - 在 Spring boot 应用程序中更新一行

java - 56 位 DES 被填充为 64 位,导致一字节解密不足