7

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

每个 Person 都有一个关系列表(或没有),当关系的 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中生成SQL语句的正确注释是OR而不是AND

4

2 回答 2

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

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

于 2015-12-31T12:31:52.787 回答
-2

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

于 2015-12-31T12:13:07.770 回答