@Entity
class Institucion {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;
}
je ekvivalentní:
@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;
}
Poznámka @ManyToOne(optional = true)
a @JoinColumn(nullable = true)
. To pro ORM znamená, že sector
atribut Institucion
je volitelná a nelze ji nastavit (na hodnotu jinou než null) po celou dobu.
Nyní zvažte následující úložiště:
public interface InstitucionRepository extends CrudRepository<Institucion, Long> {
List<Institucion> findAllByInstitucionNombre(String nombre);
List<Institucion> findAllByInstitucionEmail(String email);
}
Vzhledem k výše uvedené deklaraci entity by metody úložiště měly vytvářet dotazy jako:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionNombre=:param0
a
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias0.institucionEmail=:param0
Je to proto, že model entity označuje sector
být volitelné, takže ORM musí načíst Institucion
s bez obav o jejich sector
s.
Podle tohoto vzoru následující metoda úložiště:
List<Institucion> findAllBySector(Sector sector);
překládá do:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
Pokud Institucion.sector
není volitelný, nastavte jej jako povinný i v modelu:
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
Pokud Institucion.sector
je skutečně volitelný, bude fungovat pouze ruční dotaz, jako je ten zobrazený v odpovědi @MaciejKowalski.
Následující dotaz bude také fungovat:
List<Institucion> findAllBySectorSectorId(Long id);
To předpokládá, že názvy atributů modelu jsou přesně takové, jaké jsou uvedeny v příspěvku.