@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)
。これは、sector
がORMに Institucion
の属性 はオプションであり、常に(null以外の値に)設定されるとは限りません。
ここで、次のリポジトリについて考えてみましょう。
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
をロードする必要があります ssector
を気にせずに s。
このパターンに従って、次のリポジトリメソッドを使用します。
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);
これは、モデルの属性名が投稿に示されているとおりであることを前提としています。