sql >> Database teknologi >  >> RDS >> PostgreSQL

spring data jpa unødvendig venstre join

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

svarer til:

@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;
}

Bemærk @ManyToOne(optional = true) og @JoinColumn(nullable = true) . Dette betyder for ORM'en, at sector attribut for Institucion er valgfri og er muligvis ikke indstillet (til en ikke-nul værdi) hele tiden.

Overvej nu følgende lager:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

I betragtning af enhedserklæringen ovenfor, bør depotmetoderne producere forespørgsler som:

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

og

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

Dette skyldes, at enhedsmodellen angiver sector at være valgfri, så ORM'en skal indlæse Institucion s uden at bekymre dig om deres sector s.

Efter dette mønster, følgende lagermetode:

  List<Institucion> findAllBySector(Sector sector);

oversættes til:

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

Hvis Institucion.sector er ikke valgfrit, gør det også obligatorisk i modellen:

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

Hvis Institucion.sector er faktisk valgfrit, vil kun en manuel forespørgsel som den vist i @MaciejKowalskis svar fungere.

Følgende forespørgsel vil også fungere:

  List<Institucion> findAllBySectorSectorId(Long id);

Dette forudsætter, at modelattributnavnene er nøjagtigt som vist i indlægget.



  1. Sådan understrenger du en MySQL-tabelkolonne

  2. SQL-forespørgsel for at inkludere et specifikt WooCommerce-tag

  3. Hvordan finder jeg ud af, om der findes en tabel? MySql

  4. Sådan tælles elementer i kommasepareret liste MySQL