gpt4 book ai didi

java - spring data jpa 不必要的左连接

转载 作者:搜寻专家 更新时间:2023-11-01 01:40:39 25 4
gpt4 key购买 nike

我有以下模型:

enter image description here

我想获取所有具有指定 sectorIdInstitutions (Intituciones)。

tbInstitucion 模型中,我与 tbSector 有关系:

 @ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="`sectorId`")
private Sector sector;

有没有办法获得这样的查询:

select * 
from tbInstitucion
where sectorId = ?

我试过:findBySector(Sector sector)

但是有了这个我需要一个额外的查询来找到扇区并且 findBySector 正在生成以下查询:

select
generatedAlias0.institucionId,
generatedAlias0.institucionNombre
from
Institucion as generatedAlias0
left join
generatedAlias0.sector as generatedAlias1
where
generatedAlias1=:param0

尝试了另一个:

findBySector_sectorId

也生成上述查询。

这样的查询再好不过了:

select * 
from tbInstitucion
where sectorId = ?

有没有办法得到上面的查询?为什么 JPA 生成左连接?

最佳答案

A quick review of the entity model

@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 表明 Institucionsector 属性是可选的,不能一直设置(设置为非空值)。


How the entity model impacts repository queries

现在考虑以下存储库:

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

Solution 1

如果 Institucion.sector 不是可选的,则在模型中也将其强制设置为:

  @ManyToOne(fetch=FetchType.LAZY, optional = false)
@JoinColumn(name="`sectorId`", nullable = false)
private Sector sector;

Solution 2

如果 Institucion.sector 确实是可选的,则只有手动查询(例如 @MaciejKowalski 的回答中所示的查询)才有效。


Simplified query

下面的查询也可以工作:

  List<Institucion> findAllBySectorSectorId(Long id);

这假设模型属性名称与帖子中显示的完全相同。

关于java - spring data jpa 不必要的左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com