PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

dane wiosenne jpa niepotrzebne lewe złącze

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

jest równoważne z:

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

Uwaga @ManyToOne(optional = true) i @JoinColumn(nullable = true) . Oznacza to dla ORM, że sector atrybut Institucion jest opcjonalny i nie może być ustawiany (na wartość inną niż null) przez cały czas.

Rozważmy teraz następujące repozytorium:

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

  List<Institucion> findAllByInstitucionEmail(String email);
}

Biorąc pod uwagę powyższą deklarację encji, metody repozytorium powinny generować zapytania takie jak:

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

i

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

Dzieje się tak, ponieważ model jednostki wskazuje sector być opcjonalne, więc ORM musi wczytać Institucion s bez martwienia się o ich sector s.

Zgodnie z tym wzorcem następująca metoda repozytorium:

  List<Institucion> findAllBySector(Sector sector);

przekłada się na:

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

Jeśli Institucion.sector nie jest opcjonalne, zrób to również w modelu:

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

Jeśli Institucion.sector jest rzeczywiście opcjonalne, zadziała tylko ręczne zapytanie, takie jak to pokazane w odpowiedzi @MaciejKowalski.

Działa również następujące zapytanie:

  List<Institucion> findAllBySectorSectorId(Long id);

Zakłada się, że nazwy atrybutów modelu są dokładnie takie, jak pokazano w poście.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak napisać ograniczenie dotyczące maksymalnej liczby wierszy w postgresql?

  2. PostgreSQL - Usuwanie danych starszych niż godzina, a następnie wstawianie nowych danych do tej samej tabeli

  3. Upuść ograniczenie według nazwy w Postgresql

  4. Heroku Postgres Połączenie z aplikacji PHP localhost

  5. PL/pgSQL dla dynamicznych zapytań typu „wszystko w jednym”