我有两个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
}
关联:
@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
答案 0 :(得分:4)
您可以使用的一些选项:
Relation
实体中应用公式。@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;
}
}
但是,请记住,在单个查询中加入所有这些内容需要主人和奴隶之间的完整笛卡尔积。
答案 1 :(得分:-2)
您可以使用@FilterDef
和@Filter
注释。