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

STh*_*Fox 7 java hibernate joincolumn or-condition

我有2个Java类,Relation并且Person,它们都存在于我的数据库.

人:

@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
}
Run Code Online (Sandbox Code Playgroud)

关系:

@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
}
Run Code Online (Sandbox Code Playgroud)

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

TL; DR:当relation.child_id OR relation.parent_id = person.id=>将关系添加到人的关系列表时

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

@JoinColumns({
            @JoinColumn(name = "child_id", referencedColumnName="id"),
            @JoinColumn(name = "parent_id", referencedColumnName="id")
        })
Run Code Online (Sandbox Code Playgroud)

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

relations relations6_ 
            on this_.id=relations6_.slave_id 
            and this_.id=relations6_.master_id
Run Code Online (Sandbox Code Playgroud)

Java Hibernate中正确的注释是什么,生成一个说OR而不是AND的SQL语句

Dra*_*vic 4

您可以使用的一些选项:

  1. 数据库视图。创建为您执行自定义联接的视图并将实体映射到视图。
  2. 加入公式。我设法让它们只在多对一关联中工作。不过,您可以使关联成为双向并在实体中应用公式Relation
  3. @Subselect。这是一种 Hibernate 视图,如果您无力创建真正的数据库视图或更改数据库架构以更好地适应实体模型结构,则适合您。

这个这个答案也可能有帮助。

此外,您始终可以对从站和主站使用两个单独的关联:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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