【问题标题】:Spring boot JPA no returning existing result using findByIdSpring Boot JPA没有使用findById返回现有结果
【发布时间】:2020-02-12 13:51:10
【问题描述】:

我使用 Oracle 数据库和一些 JPA 查询创建了一个非常小而简单的 Spring Boot 应用程序。

这是不返回数据的代码sn-p,实际存在于数据库中。

letterRecipientNonOas = letterRecipientNonOasRepository
                            .findById(Long.valueOf(letterRecipientDTO.getNonOas().getId()))
                            .orElseThrow(() -> new EntityNotFoundException(LetterRecipientNonOas.class,
                                    Constant.MESSAGE_ENTITY_NOT_FOUND));

这里 findById 正在返回空结果集。

这是我的仓库

package com.care.document.repository;

import java.util.List;
import java.util.Optional;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

import com.care.document.model.LetterRecipientNonOas;

/**
 * The Interface LetterRecipientNonOasRepository.
 */
@Repository
public interface LetterRecipientNonOasRepository extends PagingAndSortingRepository<LetterRecipientNonOas, Long> {

    Optional<LetterRecipientNonOas> findByLetterId(Long id);

    Optional<LetterRecipientNonOas> findByTitleIgnoreCase(String title);

    List<LetterRecipientNonOas> findByTitleContainingIgnoreCase(String title);

    List<LetterRecipientNonOas> findAllByTitleIgnoreCaseAndIdNot(String title, Long recipientId);

    List<LetterRecipientNonOas> findAllByIdAndLetterId(long id, long letterId);

}

这是我的模型类:

package com.care.document.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PrePersist;
import javax.persistence.Table;

import org.springframework.lang.Nullable;

import com.care.admin.model.BaseEntity;
import com.care.admin.util.CommonUtil;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldDefaults;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "letter_recipient_non_oas")
public class LetterRecipientNonOas extends BaseEntity implements Serializable {

    @Id
    Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "letter_id")
    Letter letter;

    Integer recipientType; // Action/Info

    //byte recipientSubType; // Internal/External/NonOAS

    byte recipientCategory; //Internal/External
    int orderNo;
    String title;

    @Nullable
    String remarks;

    String address;

    @PrePersist
    private void prePersist() {
        this.id = CommonUtil.generateID(this.atRegion);
    }
}

我测试了,尝试了不同的方法,但没有用。

【问题讨论】:

  • 如果它没有返回任何东西,说明它不存在,或者您没有使用您认为正在使用的数据库。
  • 我验证了所有这些数据都在那里,即使我使用的数据库是正确的
  • 我对此表示怀疑,否则它会返回一些东西。结果没有说谎。因此,您的应用程序要么正在查看与您正在查看的不同的数据库,要么您看到的数据未保存在数据库中(即未提交的事务)。尽管如此,结果并没有说谎。

标签: java hibernate spring-boot jpa spring-data-jpa


【解决方案1】:

有几种情况可能会让人产生这种印象:

  1. 您正在查看错误的数据库。
  2. 当您尝试加载数据时,数据还不存在,但在您检查时数据存在。 众所周知,JPA 缓存可以相当高效地创建此类场景。
  3. 数据看起来与您想象的有些不同。这可能是由不可见或容易遗漏的内容(例如空格甚至控制字符)引起的。
  4. 您在创建数据的事务或允许脏读的会话中检查数据库,并且尚未提交创建数据的插入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2023-03-12
    • 2018-12-25
    • 2017-08-29
    • 2018-10-02
    相关资源
    最近更新 更多