PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

spring data jpa junção esquerda desnecessária

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

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

Observe @ManyToOne(optional = true) e @JoinColumn(nullable = true) . Isso significa para o ORM que o sector atributo de Institucion é opcional e não pode ser definido (para um valor não nulo) o tempo todo.

Agora considere o seguinte repositório:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
  List<Institucion> findAllByInstitucionNombre(String nombre);

  List<Institucion> findAllByInstitucionEmail(String email);
}

Dada a declaração de entidade acima, os métodos do repositório devem produzir consultas como:
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

Isso ocorre porque o modelo de entidade indica sector para ser opcional, então o ORM precisa carregar Institucion s sem se preocupar com seu sector s.

Seguindo esse padrão, o seguinte método de repositório:
  List<Institucion> findAllBySector(Sector sector);

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

Se Institucion.sector não é opcional, torne obrigatório no modelo também:
  @ManyToOne(fetch=FetchType.LAZY, optional = false)
  @JoinColumn(name="`sectorId`", nullable = false)
  private Sector sector;

Se Institucion.sector é realmente opcional, apenas uma consulta manual como a mostrada na resposta de @MaciejKowalski funcionará.

A seguinte consulta também funcionará:
  List<Institucion> findAllBySectorSectorId(Long id);

Isso pressupõe que os nomes dos atributos do modelo sejam exatamente como mostrados na postagem.