@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
est équivalent à :
@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;
}
Remarque @ManyToOne(optional = true)
et @JoinColumn(nullable = true)
. Cela signifie à l'ORM que le sector
attribut de Institucion
est facultatif et ne peut pas être défini (sur une valeur non nulle) tout le temps.
Considérons maintenant le référentiel suivant :
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
Compte tenu de la déclaration d'entité ci-dessus, les méthodes du référentiel doivent produire des requêtes telles que :
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
et
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
En effet, le modèle d'entité indique sector
être facultatif donc l'ORM doit charger Institucion
s sans se soucier de leur sector
s.
Suivant ce modèle, la méthode de référentiel suivante :
List<Institucion> findAllBySector(Sector sector);
se traduit par :
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Si Institucion.sector
n'est pas facultatif, rendez-le également obligatoire dans le modèle :
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Si Institucion.sector
est en effet facultatif, seule une requête manuelle telle que celle montrée dans la réponse de @ MaciejKowalski fonctionnera.
La requête suivante fonctionnera également :
List<Institucion> findAllBySectorSectorId(Long id);
Cela suppose que les noms d'attributs de modèle sont exactement comme indiqué dans le message.