使用OR条件而不是AND条件

时间:2015-12-31 11:52:42

标签: java hibernate joincolumn or-condition

我有两个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 =&gt;添加与人的关系列表的关系

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

@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

2 个答案:

答案 0 :(得分:4)

您可以使用的一些选项:

  1. 数据库视图。创建为您执行自定义连接的视图,并将实体映射到视图。
  2. Join formula。我设法让它们只在多对一的协会上工作。不过,您可以将关联设置为双向,并在Relation实体中应用公式。
  3. @Subselect。这是一种Hibernate视图,如果您无法创建真正的数据库视图或更改数据库模式以更好地适应实体模型结构,那么这种视图是合适的。
  4. Thisthis回答也可能有所帮助。

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

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

    但是,请记住,在单个查询中加入所有这些内容需要主人和奴隶之间的完整笛卡尔积。

答案 1 :(得分:-2)

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