PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

données de printemps jpa jointure gauche inutile

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

est équivalent à :

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

Remarque @ManyToOne(optional = true) et @JoinColumn(nullable = true) . Cela signifie à l'ORM que le sector attribut de Institucion est facultatif et ne peut pas être défini (sur une valeur non nulle) tout le temps.

Considérons maintenant le référentiel suivant :

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Compte tenu de la déclaration d'entité ci-dessus, les méthodes du référentiel doivent produire des requêtes telles que :

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

et

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

En effet, le modèle d'entité indique sector être facultatif donc l'ORM doit charger Institucion s sans se soucier de leur sector s.

Suivant ce modèle, la méthode de référentiel suivante :

  List<Institucion> findAllBySector(Sector sector);

se traduit par :

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

Si Institucion.sector n'est pas facultatif, rendez-le également obligatoire dans le modèle :

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

Si Institucion.sector est en effet facultatif, seule une requête manuelle telle que celle montrée dans la réponse de @ MaciejKowalski fonctionnera.

La requête suivante fonctionnera également :

  List<Institucion> findAllBySectorSectorId(Long id);

Cela suppose que les noms d'attributs de modèle sont exactement comme indiqué dans le message.