sql >> Databáze >  >> RDS >> PostgreSQL

jarní data jpa zbytečné levé spojení

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

je ekvivalentní:

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

Poznámka @ManyToOne(optional = true) a @JoinColumn(nullable = true) . To pro ORM znamená, že sector atribut Institucion je volitelná a nelze ji nastavit (na hodnotu jinou než null) po celou dobu.

Nyní zvažte následující úložiště:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Vzhledem k výše uvedené deklaraci entity by metody úložiště měly vytvářet dotazy jako:

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

a

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

Je to proto, že model entity označuje sector být volitelné, takže ORM musí načíst Institucion s bez obav o jejich sector s.

Podle tohoto vzoru následující metoda úložiště:

  List<Institucion> findAllBySector(Sector sector);

překládá do:

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

Pokud Institucion.sector není volitelný, nastavte jej jako povinný i v modelu:

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

Pokud Institucion.sector je skutečně volitelný, bude fungovat pouze ruční dotaz, jako je ten zobrazený v odpovědi @MaciejKowalski.

Následující dotaz bude také fungovat:

  List<Institucion> findAllBySectorSectorId(Long id);

To předpokládá, že názvy atributů modelu jsou přesně takové, jaké jsou uvedeny v příspěvku.



  1. funkce to_date se sysdate

  2. Dobrý nápad/špatný nápad? Používáte MySQL RAND() mimo malou sadu výsledků dílčích dotazů?

  3. ST_HexagonGrid geom vector k nalezení všech bodů

  4. Počítání počtu výskytů znaku v Oracle SQL