【问题标题】:Unable to retrieve records using Spring Data JPA repository when foreign key is null当外键为空时,无法使用 Spring Data JPA 存储库检索记录
【发布时间】:2018-12-17 08:09:32
【问题描述】:

我在使用外键搜索实体及其记录时遇到问题。根据业务逻辑,我需要使用帐户(不带空帐户 ID)和外键 =“回调”(带空)搜索实体 - LookupRequest 表。

请注意,帐户 ID 不是唯一的(为简单起见,我删除了表中的其他参数以使其简短)。过滤记录后,我必须将 LookupRequest.callBack 更新为外键条目。当外键为空时,我无法检索记录。

import javax.persistence.*;

@Entity
public class LookupRequest {

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

    @Column
    private String account;

    @Column
    private String caseId;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
    @JoinColumn(name = "id", unique=false, nullable=true, updatable=true)
    private Callback callback;

    public LookupRequest(String account, String caseId) {
        this.account = account;
        this.caseId = caseId;
        callback = null;
    }

    public Long getId() {
        return id;
    }

    public String getAccount() {
        return account;
    }

    public String getCaseId() {
        return caseId;
    }

    public Callback getCallback() {
        return callback;
    }

    public void setCallback(Callback callback) {
        this.callback = callback;
    }

}


@Repository
public interface LookupRequestRepository extends JpaRepository<LookupRequest, Long> {
    @Query("SELECT lr from LookupRequest lr where lr.account = :account and lr.callback = :callback")
    LookupRequest findCaseId(@Param("account") String account, @Param("callback") String callback);
}    


@Getter
@Setter
@Entity
public class Callback {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    public Long id;

    @Column(length = 20000)
    private String rawResponse;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setRawResponse(String rawResponse) {
        this.rawResponse = rawResponse;
    }

}

那我打电话如下:

LookupRequest lookupRequestFromDB = lookupRequestRepository.findCaseId("ABC", null);

出了什么问题?

【问题讨论】:

标签: java spring spring-data-jpa


【解决方案1】:

NULL 不等于任何东西,你需要使用“is NULL”。 见here

在你的情况下:

SELECT lr from LookupRequest lr where lr.account = :account and (lr.callback = :callback or lr.callback is null)

【讨论】:

  • 感谢您的回复。但是,当存在 @JoinColumn 时,我无法使用空值进行搜索。所以我改变了如下的外键引用来搜索空值。 @OneToOne(optional = true) @MapKeyJoinColumn(name="id") 私有回调回调;并将 jpa 查询更改为 LookupRequest findTopByAccountAndCallbackIsNullOrderByCreatedAtAsc(String account);
猜你喜欢
  • 2017-01-13
  • 2014-11-16
  • 2022-11-15
  • 2017-07-19
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
相关资源
最近更新 更多