实体模型
@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表明属性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
•不用担心自己的sector
秒。
在此之后的图案,下面库方法:
List<Institucion> findAllBySector(Sector sector);
转换为:
select
generatedAlias0
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0
溶液1
如果Institucion.sector
是不可选的,使其在模型过于强制性:
@ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;
解决方案2
如果Institucion.sector
确实是可选的,只能进行手动查询,如显示的一个@ MaciejKowalski的答案将起作用。
简化查询
下面的查询也将工作:
List<Institucion> findAllBySectorSectorId(Long id);
这假设模型属性名是严格按照显示在后。
但是为什么它会生成一个连接,不会更好一个select * from tbInstitucion where sectorId =? – rena
那不是你如何在orm中编写查询..你得到了依赖实体..然后你得到它的id。 –