spring 一对一关系&带有可选字段的DTO投影(INNER JOIN)

tkclm6bt  于 2023-08-02  发布在  Spring
关注(0)|答案(1)|浏览(113)

我有一个实体:

public class Bird {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@OneToOne(optional = true)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "current_transmitter_id", nullable = true)
private Transmitter currentTransmitter;
....
}

字符串
不是每只鸟都有CurrentTransmitter相关的。
我的DTO投影查询是:

@Query("SELECT NEW com.contoso.view.BirdSummaryDTO(b.name, b.sex, b.currentTransmitter ) FROM Bird b")
List<BirdSummaryDTO> listBirdDTO();


BirdSummaryDTO看起来像:

public class BirdSummaryDTO {

final String name;
final String sex;
final Transmitter currentTransmitter;

public BirdSummaryDTO(Integer id, Transmitter currentTransmitter) {
    this.name = name;
    this.sex = sex;
    this.currentTransmitter = currentTransmitter;
}


然而,我的查询只返回具有发射器的鸟类。它正在使用内部连接。

**Q:**是否有注解或方法使其返回所有鸟类,无论它们是否有电流发射器?

ylamdve6

ylamdve61#

为了解决这个问题,我不需要接触实体。HQL中的“隐式连接”,如B.currentTransmitter,总是内部连接。
DTO- scope从final更改为private:

public class BirdSummaryDTO {

private String name;
private String sex;
private Transmitter currentTransmitter;

public BirdSummaryDTO(Integer id, Transmitter currentTransmitter) {
    this.name = name;
    this.sex = sex;
    this.currentTransmitter = currentTransmitter;
}

字符串
然后,在存储库中的查询更改为LEFT JOIN(即OUTER):

@Query("SELECT NEW com.contoso.view.BirdSummaryDTO(b.name, b.sex, b.status, b.currentTransmitter) FROM Bird b LEFT JOIN b.currentTransmitter t")
List<BirdSummaryDTO> listBirdDTO();

注意在查询中,我必须显式地声明LEFT JOIN。这将左联接更改为左外联接。

相关问题