JPA: Cómo verificar una condición antes en una relación ManyToOne
Tengo 2 entidades, Car
y Person
. Una persona puede tener varios carros. Así que tengo:
@Entity
@NoArgsConstructor
@Getter
@Table(name="Car")
public class Car {
@Id
private String id;
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "person_id")
private Person person;
}
@Entity
@NoArgsConstructor
@Getter
@Table(name="Person")
public class Person {
@Id
private String id;
private String name;
private String address;
}
Sin embargo, solo quiero cargar los carros de los cuales el propietario tiene una dirección establecida (es decir, no es nula).
He intentado agregar:
@Where(clause = "address IS NOT NULL")
pero no ha funcionado.
Para traducirlo a términos de SQL, necesito que la consulta sea:
SELECT * FROM car c JOIN person p ON c.person_id = p.id WHERE p.address IS NOT NULL
davy.ai
Para cargar solo los autos cuyos propietarios tienen una dirección no nula, puedes utilizar una consulta JPQL con una unión y una condición en la dirección del propietario.
Aquí tienes un ejemplo de dicha consulta:
Esta consulta utiliza una unión para recuperar solo los autos cuyos propietarios tienen una dirección, basándose en la condición
p.address IS NOT NULL
. La cláusulaJOIN
vincula la entidadCar
con la entidad relacionadaPerson
, y la cláusulaWHERE
filtra el conjunto de resultados según la condición.Ten en cuenta que esta consulta utiliza JPQL (Java Persistence Query Language), no SQL, para obtener datos de la base de datos. JPQL es un lenguaje de nivel superior que es traducido a SQL por el proveedor de JPA.
También puedes definir una consulta con nombre en la entidad
Car
para reutilizar la misma consulta en varios lugares:Esta consulta con nombre se puede llamar utilizando
entityManager.createNamedQuery("Car.findCarsWithOwnerAddress", Car.class)
para obtener el mismo conjunto de resultados.