sql >> Database >  >> RDS >> PostgreSQL

spring data jpa onnodig left join

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

is gelijk aan:

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

Opmerking @ManyToOne(optional = true) en @JoinColumn(nullable = true) . Dit betekent voor de ORM dat de sector attribuut van Institucion is optioneel en kan niet altijd worden ingesteld (op een niet-null-waarde).

Overweeg nu de volgende opslagplaats:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Gezien de entiteitsverklaring hierboven, zouden de repository-methoden query's moeten produceren zoals:

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

en

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

Dit komt omdat het entiteitsmodel sector aangeeft om optioneel te zijn, dus de ORM moet Institucion load laden s zonder je zorgen te maken over hun sector v.

Volgens dit patroon, de volgende repository-methode:

  List<Institucion> findAllBySector(Sector sector);

vertaalt naar:

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

Als Institucion.sector is niet optioneel, maak het ook verplicht in het model:

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

Als Institucion.sector is inderdaad optioneel, alleen een handmatige zoekopdracht zoals die in het antwoord van @MaciejKowalski wordt weergegeven, zal werken.

De volgende zoekopdracht werkt ook:

  List<Institucion> findAllBySectorSectorId(Long id);

Dit veronderstelt dat de namen van de modelattributen precies zijn zoals weergegeven in de post.



  1. LISTAGG Query ORA-00937:geen groepsfunctie voor één groep

  2. Het toevoegen van een niet-nulbare kolom aan een bestaande tabel mislukt. Wordt het waardekenmerk genegeerd?

  3. FOUT 1356 (HY000):weergave 'mysql.user' verwijst naar ongeldige tabel(len) of kolom(men) of functie(s) of definiëring/aanroeper van weergave heeft geen rechten om ze te gebruiken

  4. MySQL-partitionering:prestatieverhoging Voor meerdere gepartitioneerde tabellen. Waarom?