@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
е еквивалентно на:
@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;
}
Забележка @ManyToOne(optional = true)
и @JoinColumn(nullable = true)
. Това означава за ORM, че sector
атрибут на Institucion
не е задължително и не може да бъде зададено (на ненулева стойност) през цялото време.
Сега разгледайте следното хранилище:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
Като се има предвид декларацията на обекта по-горе, методите на хранилището трябва да генерират заявки като:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
и
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
Това е така, защото моделът на обекта посочва sector
да не е задължително, така че ORM трябва да зареди Institucion
s без да се тревожат за своя sector
с.
Следвайки този модел, следният метод на хранилище:
List<Institucion> findAllBySector(Sector sector);
се превежда на:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Ако Institucion.sector
не е задължително, направете го задължително и в модела:
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Ако Institucion.sector
наистина е по избор, само ръчна заявка като тази, показана в отговора на @MaciejKowalski, ще работи.
Следната заявка също ще работи:
List<Institucion> findAllBySectorSectorId(Long id);
Това предполага, че имената на атрибутите на модела са точно както е показано в публикацията.