java - perder - diseño de tablas en html
Anotación para unir columnas con la condición OR en lugar de AND (2)
Tengo 2 clases de Java, Relation
y Person
, que están presentes en mi base de datos.
Persona:
@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
}
Relación:
@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
}
Cada persona tiene una lista de relaciones (o no), la relación debe agregarse a la lista cuando child_id o parent_id de la relación es igual a la identificación de la persona.
TL; DR: cuando relation.child_id OR relation.parent_id = person.id
=> agrega relación a la lista de relaciones con la persona
El problema que estoy enfrentando es que esta anotación:
@JoinColumns({
@JoinColumn(name = "child_id", referencedColumnName="id"),
@JoinColumn(name = "parent_id", referencedColumnName="id")
})
crea el siguiente SQL (solo la parte necesaria):
relations relations6_
on this_.id=relations6_.slave_id
and this_.id=relations6_.master_id
Cuál es la anotación correcta en Java Hibernate para generar una declaración SQL que diga O en lugar de Y
Puedes usar las anotaciones @FilterDef
y @Filter
.
Algunas de las opciones que puede utilizar:
- Vistas de la base de datos Cree la vista que se una personalizada para usted y asigne la entidad a la vista.
- Únete a la fórmula . Pude hacer que funcionaran solo en asociaciones de muchos a uno. Sin embargo, puede hacer que la asociación sea bidireccional y aplicar la fórmula en la entidad de
Relation
. -
@Subselect
. Este es un tipo de vista Hibernate, adecuada si no puede permitirse crear una vista de base de datos real o cambiar el esquema db para que se ajuste mejor a la estructura del modelo de la entidad.
Esto y esta respuesta también podrían ser útiles.
Además, siempre puede usar dos asociaciones separadas para esclavos y maestros:
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;
}
}
Sin embargo, tenga en cuenta que unir todos ellos en una sola consulta requiere un producto cartesiano completo entre maestros y esclavos.