我有以下界面
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 两个字段都有值时,上述查询有效(返回结果)。如果任何字段为空,则尽管数据库中有匹配的数据,查询也不会将数据映射到接口对象。
有人可以帮我吗?最近几天一直被困住。
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"