使用OR条件而不是AND条件连接列的注释 [英] Annotation to join columns with OR condition instead of AND condition
问题描述
我有两个java类, Relation
和 Person
,它们都存在于我的数据库中。
Person:
@Entity
@Table(name = person)
public class Person {
@Id
@Column
private int id;
@Column
私人字符串名称;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumns({
@JoinColumn(name =slave_id,referencedColumnName =id),
@ JoinColumn(name =master_id,referencedColumnName =id)
})
private List< Relation>关系;
// Getters and setters
}
关系:
@Entity
@Table(name =relations)
公共类关系{
@Id
@Column
private int id;
@Column
private int child_id;
@Column
private int parent_id;
@Column
私有字符串类型;
// Getters and setters
}
每个人都有关系列表(或不),当关系的child_id或parent_id等于人的id时,关系应该被添加到列表中。
TL; DR:
当 relation.child_id或relation.parent_id = person.id
=>将关系添加到人员关系列表中时
$ b
我遇到的问题是这个注解:
@JoinColumns({
@JoinColumn(name =child_id,referencedColumnName =id),
@JoinColumn(name =parent_id,referencedColumnName =id)
})
$ c
$ b 创建以下SQL(只是必要的部分):
关系关系6_
在this_.id = relations6_.slave_id
和this_.id = relations6_.master_id
Java Hibernate中ge正确的注释是什么?使用 OR 而不是 AND
解释方法
您可以使用的选项:
- 数据库视图。为您创建自定义连接并将实体映射到视图的视图。 加入公式。我设法让他们只在多对一的协会工作。不过,您可以将关联设为双向并将公式应用于
Relation
实体中。 -
@Subselect
。这是一种Hibernate视图,适用于无法创建实际数据库视图或更改数据库模式以更好地适应实体模型结构的情况。
此和 另外,您总是可以为奴隶和主人使用两个单独的关联: 然而,请记住,加入所有这些一个查询需要主从机之间的完整笛卡尔积。 I have 2 java classes, Person: Relation: Each Person has a list of relations (or not), the relation should be added to the list when the child_id or the parent_id of the relation is equal to the id of the person. TL;DR:
When The issue I am facing is that this annotation: creates following SQL (just the necessary part): What is the correct annotation in Java Hibernate to generate an SQL statement saying OR instead of AND Some of the options that you could utilize: This and this answer could also be helpful. Also, you can always use two separate associations for slaves and masters: However, keep in mind that joining all of them in a single query requires full Cartesian product between masters and slaves. 这篇关于使用OR条件而不是AND条件连接列的注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
public class Person {
@OneToMany
@JoinColumn(name =slave_id),
private List< Relation>奴隶;
@OneToMany
@JoinColumn(name =master_id),
private List< Relation>主人;
公共列表<关系> getRelations(){
List< Relation> result = new ArrayList<>(slaves);
result.addAll(masters);
返回结果;
$ / code> Relation
and Person
, which both are present in my database.@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
}
relation.child_id OR relation.parent_id = person.id
=> add relation to list of relations to the person@JoinColumns({
@JoinColumn(name = "child_id", referencedColumnName="id"),
@JoinColumn(name = "parent_id", referencedColumnName="id")
})
relations relations6_
on this_.id=relations6_.slave_id
and this_.id=relations6_.master_id
Relation
entity.@Subselect
. This is a kind of Hibernate view, suitable if you can't afford to create a real database view or change the db schema to better suit the entity model structure.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;
}
}