@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.