Невозможно получить записи, используя репозиторий Spring Data JPA, когда внешний ключ имеет значение null - PullRequest
0 голосов
/ 17 декабря 2018

Я сталкиваюсь с проблемой при поиске сущности и ее записей с помощью внешнего ключа.Согласно бизнес-логике, мне нужно искать таблицу Entity - LookupRequest с учетной записью (с ненулевым идентификатором учетной записи) и внешним ключом = "обратный вызов" (с нулевым).

Обратите внимание, что идентификатор учетной записи не является уникальным (для простоты я удалил другие параметры в таблице, чтобы сделать его коротким).После того, как я отфильтрую запись, мне нужно обновить LookupRequest.callBack до записи Foreignkey.Я не могу получить записи, когда внешний ключ имеет значение null.

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);

Что не так?

1 Ответ

0 голосов
/ 17 декабря 2018

NULL не сравнивается равным ни с чем, вам нужно использовать «is NULL».См. здесь

В вашем случае:

SELECT lr from LookupRequest lr where lr.account = :account and (lr.callback = :callback or lr.callback is null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...