一尘不染

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

hibernate

我有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时,应将关系添加到列表中。

TL; DR:当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中正确的注释是什么,以生成一条用 OR* 代替 AND 的SQL语句 *


阅读 249

收藏
2020-06-20

共1个答案

一尘不染

您可以利用的一些选项:

  1. 数据库视图。创建为您执行自定义联接的视图,然后将实体映射到该视图。
  2. 加入公式。我设法使它们仅在多对一关联中起作用。但是,您可以使关联双向,并在Relation实体中应用公式。
  3. @Subselect。这是一种Hibernate视图,适用于您无力创建真实的数据库视图或更改db模式以更好地适合实体模型结构的情况。

此外,您始终可以为从属服务器和主服务器使用两个单独的关联:

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;
    }
}

但是,请记住,将它们全部合并到一个查询中需要在主服务器和从服务器之间使用完整的笛卡尔积。

2020-06-20