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