PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Federdaten jpa unnötige linke Verbindung

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

entspricht:

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

Beachten Sie @ManyToOne(optional = true) und @JoinColumn(nullable = true) . Dies bedeutet für das ORM, dass der sector Attribut von Institucion ist optional und darf nicht immer (auf einen Nicht-Null-Wert) gesetzt werden.

Betrachten Sie nun das folgende Repository:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Angesichts der obigen Entitätsdeklaration sollten die Repository-Methoden Abfragen wie die folgenden erzeugen:

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

und

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

Dies liegt daran, dass das Entitätsmodell sector angibt optional sein, also muss das ORM Institucion laden s ohne sich Gedanken über ihren sector zu machen s.

Nach diesem Muster die folgende Repository-Methode:

  List<Institucion> findAllBySector(Sector sector);

übersetzt zu:

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

Wenn Institucion.sector ist nicht optional, machen Sie es auch im Modell obligatorisch:

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

Wenn Institucion.sector ist in der Tat optional, nur eine manuelle Abfrage wie die in @MaciejKowalskis Antwort gezeigte funktioniert.

Die folgende Abfrage funktioniert auch:

  List<Institucion> findAllBySectorSectorId(Long id);

Dies setzt voraus, dass die Modellattributnamen genau so sind, wie im Beitrag gezeigt.