es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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:

    TypedQuery<car> query = entityManager.createQuery(
        "SELECT c FROM Car c JOIN c.person p WHERE p.address IS NOT NULL", Car.class);
    List<car> cars = query.getResultList();
    

    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áusula JOIN vincula la entidad Car con la entidad relacionada Person, y la cláusula WHERE 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:

    @Entity
    @Table(name="Car")
    @NamedQuery(name="Car.findCarsWithOwnerAddress",
        query="SELECT c FROM Car c JOIN c.person p WHERE p.address IS NOT NULL")
    public class Car {
        //...
    }
    

    Esta consulta con nombre se puede llamar utilizando entityManager.createNamedQuery("Car.findCarsWithOwnerAddress", Car.class) para obtener el mismo conjunto de resultados.

Comments are closed.