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

spring data jpa join sinistro non necessario

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

equivale 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) e @JoinColumn(nullable = true) . Questo significa per l'ORM che il sector attributo di Institucion è facoltativo e non può essere impostato (su un valore non nullo) tutto il tempo.

Ora considera il seguente repository:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Data la dichiarazione di entità sopra, i metodi del repository dovrebbero produrre query come:

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

e

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

Questo perché il modello di entità indica sector essere facoltativo, quindi l'ORM deve caricare Institucion s senza preoccuparsi del loro sector s.

Seguendo questo schema, il seguente metodo di repository:

  List<Institucion> findAllBySector(Sector sector);

si traduce in:

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

Se Institucion.sector non è opzionale, rendilo obbligatorio anche nel modello:

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

Se Institucion.sector è effettivamente facoltativo, funzionerà solo una query manuale come quella mostrata nella risposta di @MaciejKowalski.

Funzionerà anche la seguente query:

  List<Institucion> findAllBySectorSectorId(Long id);

Ciò presuppone che i nomi degli attributi del modello siano esattamente come mostrati nel post.