JPA - OneToMany с условием ИЛИ - PullRequest
0 голосов
/ 29 мая 2020

У меня есть 2 SQL таблиц, «узел» и «край».

Таблица «узел» имеет составной первичный ключ, который состоит из двух столбцов: «id» и «type».

Таблица "edge" содержит следующие столбцы:

  • node_1_id: идентификатор первого узла края
  • node_1_type: тип первого узла края
  • node_2_id: идентификатор второго узла края
  • node_2_type: тип второго узла края

Также есть два ограничения внешнего ключа, которые связывают ("node_1_id", "node_1_type") и ("node_2_id", "node_2_type") с "id" и "type" таблицы "node".

Я создал следующий объект 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;
}

В объекте «Узел» я хотел бы создать отношение «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';

Как я могу создать такое отношение ион?

1 Ответ

0 голосов
/ 01 июня 2020

Обязательно ли быть одинарными @OneToMany отношениями? В противном случае вы могли бы добавить аналоги к двум отношениям @ManyToOne и создать метод получения, который просто возвращает один объединенный список:

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...