sql >> Base de Datos >  >> RDS >> PostgreSQL

spring data jpa unión izquierda innecesaria

@Entity
class Institucion {
  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="`sectorId`")
  private Sector sector;
}

es equivalente a:

@Entity
class Institucion {
  @ManyToOne(cascade = {}
             , fetch=FetchType.LAZY
             , optional = true
             , targetEntity = void.class)
  @JoinColumn(columnDefinition = ""
             , foreignKey = @ForeignKey
             , insertable = true
             , name="`sectorId`"
             , nullable = true
             , referencedColumnName = ""
             , table = ""
             , unique = false
             , updatable = false)
  private Sector sector;
}

Nota @ManyToOne(optional = true) y @JoinColumn(nullable = true) . Esto significa para el ORM que el sector atributo de Institucion es opcional y no se puede establecer (a un valor no nulo) todo el tiempo.

Ahora considere el siguiente repositorio:

public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
  List<Institucion> findAllByInstitucionNombre(String nombre);

  List<Institucion> findAllByInstitucionEmail(String email);
}

Dada la declaración de entidad anterior, los métodos del repositorio deberían producir consultas como:

select
    generatedAlias0 
from
    Institucion as generatedAlias0 
left join
    generatedAlias0.sector as generatedAlias1 
where
    generatedAlias0.institucionNombre=:param0

y

select
    generatedAlias0 
from
    Institucion as generatedAlias0 
left join
    generatedAlias0.sector as generatedAlias1 
where
    generatedAlias0.institucionEmail=:param0

Esto se debe a que el modelo de entidad indica sector ser opcional por lo que el ORM necesita cargar Institucion s sin preocuparse por su sector s.

Siguiendo este patrón, el siguiente método de repositorio:

  List<Institucion> findAllBySector(Sector sector);

se traduce como:

select
    generatedAlias0 
from
    Institucion as generatedAlias0 
left join
    generatedAlias0.sector as generatedAlias1 
where
    generatedAlias1=:param0

Si Institucion.sector no es opcional, hágalo obligatorio en el modelo también:

  @ManyToOne(fetch=FetchType.LAZY, optional = false)
  @JoinColumn(name="`sectorId`", nullable = false)
  private Sector sector;

Si Institucion.sector es opcional, solo funcionará una consulta manual como la que se muestra en la respuesta de @MaciejKowalski.

La siguiente consulta también funcionará:

  List<Institucion> findAllBySectorSectorId(Long id);

Esto supone que los nombres de los atributos del modelo son exactamente como se muestran en la publicación.