@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
es equivalente a:
@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;
}
Nota @ManyToOne(optional = true)
y @JoinColumn(nullable = true)
. Esto significa para el ORM que el sector
atributo de Institucion
es opcional y no se puede establecer (a un valor no nulo) todo el tiempo.
Ahora considere el siguiente repositorio:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
Dada la declaración de entidad anterior, los métodos del repositorio deberían producir consultas como:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
y
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
Esto se debe a que el modelo de entidad indica sector
ser opcional por lo que el ORM necesita cargar Institucion
s sin preocuparse por su sector
s.
Siguiendo este patrón, el siguiente método de repositorio:
List<Institucion> findAllBySector(Sector sector);
se traduce como:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Si Institucion.sector
no es opcional, hágalo obligatorio en el modelo también:
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Si Institucion.sector
es opcional, solo funcionará una consulta manual como la que se muestra en la respuesta de @MaciejKowalski.
La siguiente consulta también funcionará:
List<Institucion> findAllBySectorSectorId(Long id);
Esto supone que los nombres de los atributos del modelo son exactamente como se muestran en la publicación.