当其中一个字段没有值时,JPA 查询不返回结果

问题描述 投票:0回答:1

我有以下界面

public interface SchemeInterface {
    public Long getId(); 
    public String getVibName(); 
    public String getTerritoryName(); 
    public String getAllIndiaDistributionTerritories();
    public String getChannels(); 
    public String getPayerName(); 
    public String getPayerCode(); 
    public String getPayerTerritory(); 
    public SchemeInputSheet getSchemeInputSheet(); 
    public SupportAddOffInr getSupportAddOffInr(); 
    public SupportAddOffPercent getSupportAddOffPercent(); 

}

SchemeInput 实体如下,我映射了 supportAddOffInr 和 supportAddOffPercent 的 @OneToOne

@Entity
@Table(name = "scheme_input")
public class SchemeInput implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "type")
    private String type;

    @ManyToOne(cascade = CascadeType.PERSIST)
    @JsonIgnoreProperties("schemeInput")
    private SchemeInputSheet schemeInputSheet;

    @OneToOne(cascade = CascadeType.ALL)
    @JsonIgnoreProperties("schemeInput")
    private SupportAddOffInr supportAddOffInr;

    @OneToOne(cascade = CascadeType.ALL)
    @JsonIgnoreProperties("schemeInput")
    private SupportAddOffPercent supportAddOffPercent;
    .
    .
    .
    .
}

我正在尝试如下查询 -

@Query("SELECT si.id as id, si.vibName as vibName, si.territoryName as territoryName, si.allIndiaDistributionTerritories as allIndiaDistributionTerritories, si.channels as channels, "+ 
        "si.payerName as payerName, si.payerCode as payerCode, si.payerTerritory as payerTerritory, si.schemeInputSheet as schemeInputSheet, si.supportAddOffInr as supportAddOffInr ,  si.supportAddOffPercent as supportAddOffPercent FROM SchemeInput si "

在数据库中 -

getSupportAddOffInr 
&
getSupportAddOffPercent 
可以为空

问题是当 getSupportAddOffInr 和 getSupportAddOffPercent 两个字段都有值时,上述查询有效(返回结果)。如果任何字段为空,则尽管数据库中有匹配的数据,查询也不会将数据映射到接口对象。

有人可以帮我吗?最近几天一直被困住。

spring-boot hibernate jpa interface
1个回答
0
投票

JPA 规范规定,在关系中使用点符号会强制进行内部联接。如果您希望能够获取可能为空的关系,则需要定义您希望查询使用左外连接:

"SELECT si.id as id, si.vibName as vibName, si.territoryName as territoryName, si.allIndiaDistributionTerritories as allIndiaDistributionTerritories, si.channels as channels, "+ 
        "si.payerName as payerName, si.payerCode as payerCode, si.payerTerritory as payerTerritory, si.schemeInputSheet as schemeInputSheet, supportAddOffInr1 as supportAddOffInr ,  supportAddOffPercent1 as supportAddOffPercent FROM SchemeInput si LEFT OUTER JOIN si.supportAddOffInr supportAddOffInr1 LEFT OUTER JOIN si.supportAddOffPercent supportAddOffPercent1"
© www.soinside.com 2019 - 2024. All rights reserved.