@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
svarer til:
@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;
}
Bemærk @ManyToOne(optional = true)
og @JoinColumn(nullable = true)
. Dette betyder for ORM'en, at sector
attribut for Institucion
er valgfri og er muligvis ikke indstillet (til en ikke-nul værdi) hele tiden.
Overvej nu følgende lager:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
I betragtning af enhedserklæringen ovenfor, bør depotmetoderne producere forespørgsler som:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
og
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
Dette skyldes, at enhedsmodellen angiver sector
at være valgfri, så ORM'en skal indlæse Institucion
s uden at bekymre dig om deres sector
s.
Efter dette mønster, følgende lagermetode:
List<Institucion> findAllBySector(Sector sector);
oversættes til:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Hvis Institucion.sector
er ikke valgfrit, gør det også obligatorisk i modellen:
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Hvis Institucion.sector
er faktisk valgfrit, vil kun en manuel forespørgsel som den vist i @MaciejKowalskis svar fungere.
Følgende forespørgsel vil også fungere:
List<Institucion> findAllBySectorSectorId(Long id);
Dette forudsætter, at modelattributnavnene er nøjagtigt som vist i indlægget.