我有 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/