CrudRepository findById dont return java.util. Optional



public interface LmsRepository extensions CrudRepository 我没有 findOne 方法来获取单个计数,所以当我使用 findById 时,我得到了这个异常。在类型 [java.util.Optional] 上找不到属性 [id]" 我该如何解决这个麻烦?

这是我的克鲁德回购

@Repository
public interface LmsRepository extends CrudRepository<Book, Long> {

}

实体文件

@Entity(name="lms_tbl")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name="book_name")
private String bookName;
private String author;
@Column(name="purchase_date")
@Temporal(TemporalType.DATE)
private Date purchaseDate;
public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
and other....

服务文件

@Service
public class LmsService {
@Autowired
private LmsRepository lmsRepository;
public Collection<Book> findAllBooks(){
    ArrayList<Book> books = new ArrayList<Book>();
    for (Book book : lmsRepository.findAll()) {
        books.add(book);
    }
    return books;
}
public void deleteBook(long id) {
    lmsRepository.deleteById(id);
}
public Optional<Book> findById(Long id) {
    return lmsRepository.findById(id);
}

}

控制器文件

@Controller
public class MainController {
@Autowired
private LmsService lmsService;

@GetMapping("/")
public String index(HttpServletRequest req) {
    req.setAttribute("books", lmsService.findAllBooks());
    req.setAttribute("mode","BOOK_VIEW");
    return "index";
}
@GetMapping("/updateBook")
public String index(@RequestParam Long id,HttpServletRequest req) {
    req.setAttribute("book", lmsService.findById(id));
    req.setAttribute("mode","BOOK_EDIT");
    return "index";
}

}

我尝试在 CrudRepo 中添加新方法,但它不起作用。

在您的服务类中更改此

public Optional<Book> findById(Long id) {
    return lmsRepository.findById(id);
}

对此

public Book findById(Long id) {
    return lmsRepository.findById(id).get();
}

说明:Optional是一个包装类,可能包含也可能不包含非空值。您收到该错误是因为您尝试在模型中插入Optional,而不是Book。由于Optional不包含任何id字段,因此会出现错误。 Optional用于在具有不希望它为 null 的空对象时具有抛出异常的 defalut 值。例如,您可以创建在 null 可选的情况下自动引发异常。例如,您可以通过以下方式升级服务:

public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(RuntimeException::new);
}

这将在Optional内随时抛出RuntimeException Book为空,或者会给你Book类的值。

更优雅的解决方案如下:

public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(NotFoundException::new);
}

具有:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
}

这样,当可选包含Book时,该将返回到控制器并插入模型中。如果Optional包含空值,则将抛出NotFoundException,不需要捕获它,并且将被映射到 404 HTTP 错误。

您可以在界面中添加方法

@Repository
public interface LmsRepository extends CrudRepository<Book, Long> {
Optional<Book> findById(Long id);
}

您可以在存储库中创建自己的方法。

LmsRepository<CustomClass> extends CrudRepository<CustomClass> {
  Optional<CustomClass> findById(int id);
}

在您的实体中,您在 id 上声明@Id,因此 findById 遵循此(主键(数据类型,即存储库管理的实体的 ID。

只需将.get()放在lmsRepository.findById(id).get()之后;

.get()解析并将返回从数据库中捕获的 [lms 对象]

无需覆盖、实施等。

相关内容

最新更新