@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
é 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;
}
Observe
@ManyToOne(optional = true)
e @JoinColumn(nullable = true)
. Isso significa para o ORM que o sector
atributo de Institucion
é opcional e não pode ser definido (para um valor não nulo) o tempo todo. Agora considere o seguinte repositório:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
Dada a declaração de entidade acima, os métodos do repositório devem produzir consultas como:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
e
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
Isso ocorre porque o modelo de entidade indica
sector
para ser opcional, então o ORM precisa carregar Institucion
s sem se preocupar com seu sector
s. Seguindo esse padrão, o seguinte método de repositório:
List<Institucion> findAllBySector(Sector sector);
traduz para:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Se
Institucion.sector
não é opcional, torne obrigatório no modelo também: @ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Se
Institucion.sector
é realmente opcional, apenas uma consulta manual como a mostrada na resposta de @MaciejKowalski funcionará. A seguinte consulta também funcionará:
List<Institucion> findAllBySectorSectorId(Long id);
Isso pressupõe que os nomes dos atributos do modelo sejam exatamente como mostrados na postagem.