使用 OR 条件而不是 AND 条件连接列的注释

Annotation to join columns with OR condition instead of AND condition

我有 2 java 类、RelationPerson,它们都存在于我的数据库中。

人:

@Entity
@Table(name = "persons")
public class Person {
    @Id
    @Column
    private int id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name = "slave_id", referencedColumnName="id"),
        @JoinColumn(name = "master_id", referencedColumnName="id")
    })
    private List<Relation> relations;

    //Getters and setters
}

关系:

@Entity
@Table(name = "relations")
public class Relation {
    @Id
    @Column
    private int id;

    @Column
    private int child_id;

    @Column
    private int parent_id;

    @Column
    private String type;

    //Getters and setters
}

每个人都有一个关系列表(或没有),当关系的child_id或parent_id等于人的id时,应该将关系添加到列表中.

长话短说: 当 relation.child_id OR relation.parent_id = person.id => 将关系添加到此人的关系列表中

我面临的问题是这个注释:

@JoinColumns({
            @JoinColumn(name = "child_id", referencedColumnName="id"),
            @JoinColumn(name = "parent_id", referencedColumnName="id")
        })

创建以下 SQL(只是必要的部分):

relations relations6_ 
            on this_.id=relations6_.slave_id 
            and this_.id=relations6_.master_id

在 Java Hibernate 中生成 SQL 语句的正确注释是 OR 而不是 AND

您可以使用 @FilterDef@Filter 注释。

您可以使用的一些选项:

  1. 数据库浏览量。创建为您执行自定义联接的视图并将实体映射到视图。
  2. Join formula。我设法使它们仅适用于 many-to-one 关联。不过,您可以使关联双向并在 Relation 实体中应用公式。
  3. @Subselect。这是一种 Hibernate 视图,如果您无力创建真正的数据库视图或更改数据库模式以更好地适应实体模型结构,则适用。

and this 回答也可能有帮助。

此外,您始终可以为奴隶和主人使用两个单独的关联:

public class Person {
    @OneToMany
    @JoinColumn(name = "slave_id"),
    private List<Relation> slaves;

    @OneToMany
    @JoinColumn(name = "master_id"),
    private List<Relation> masters;

    public List<Relation> getRelations() {
        List<Relation> result = new ArrayList<>(slaves);
        result.addAll(masters);
        return result;
    }
}

但是,请记住,将所有这些连接到一个查询中需要主从之间的完整笛卡尔积。