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

我有两个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 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等于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") }) 

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

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

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

您可以使用的一些选项:

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

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

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

 public class Person { @OneToMany @JoinColumn(name = "slave_id"), private List slaves; @OneToMany @JoinColumn(name = "master_id"), private List masters; public List getRelations() { List result = new ArrayList<>(slaves); result.addAll(masters); return result; } } 

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

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