无法在我的 JpaRepository 代码中使用 findOne() [重复]

Posted

技术标签:

【中文标题】无法在我的 JpaRepository 代码中使用 findOne() [重复]【英文标题】:Can't use findOne() in my code with JpaRepository [duplicate] 【发布时间】:2018-09-08 17:27:55 【问题描述】:

我有一个 Personne 类的项目

package com.example.entities;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@SuppressWarnings("serial")
@Entity  
public class Personne implements Serializable 

    @Id
    @GeneratedValue
    private Long id;
    @Column(length = 80, name = "NOM")
    private String nom;
    @Column(length = 80, name = "PRENOM")
    private String prenom;
    @Column(length = 80, name = "ADRESSE")
    private String adresse;
    @Column(length = 80, name = "EMAIL")
    private String email;
    @Column(length = 80, name = "TELEPHONE")
    private String telephone;

    public Long getId() 
        return id;
    

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

    public String getNom() 
        return nom;
    

    public void setNom(String nom) 
        this.nom = nom;
    

    public String getPrenom() 
        return prenom;
    

    public void setPrenom(String prenom) 
        this.prenom = prenom;
    

    public String getAdresse() 
        return adresse;
    

    public void setAdresse(String adresse) 
        this.adresse = adresse;
    

    public String getEmail() 
        return email;
    

    public void setEmail(String email) 
        this.email = email;
    

    public String getTelephone() 
        return telephone;
    

    public void setTelephone(String telephone) 
        this.telephone = telephone;
    

    public Personne() 
        super();
    

PersonRepository的接口在这里

package com.example.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.entities.Personne;

public interface IPersonneRepository extends JpaRepository<Personne, Long>     


在控制器中我添加了 CRUD 的方法(创建、读取、更新和删除),这些方法都在这个类中

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.entities.Personne;
import com.example.repositories.IPersonneRepository;

@RestController
@RequestMapping(value = "/personne")
public class PersonController 

    @Autowired
    private IPersonneRepository iPersonneRepository;

    @PostMapping(value = "/create")
    public Personne createPersonne(@RequestBody Personne personne) 
        return iPersonneRepository.save(personne);
    

    @PutMapping(value = "/update/id")
    public Personne updatePersonne(@PathParam(value = "id") Long id, @RequestBody Personne personne) 
        if (id != null) 
            Personne p = iPersonneRepository.findOne(id);
            if (p != null) 
                iPersonneRepository.save(personne);
            
        
        return personne;
    

    @DeleteMapping(value = "/delete/id")
    public void delete(@PathParam(value = "id") Long id) 
        if (id != null) 
            Personne p = iPersonneRepository.findOne(id);
            if (p != null) 
                iPersonneRepository.delete(p);
            
        
    

    @GetMapping(value = "/all")
    public List<Personne> allPerson() 
        return iPersonneRepository.findAll();
    

    @GetMapping(value = "/per/id")
    public Personne getOne(@PathParam(value = "id") Long id) 
        if (id != null) 
            Personne p = iPersonneRepository.findOne(id);
            return p;
         

    

application.properties 是

spring.datasource.url = jdbc:mysql://localhost:3306/spring_boot_DB? 
createDatabaseIfNotExist=true
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.jpa.database=MYSQL
spring.jpa.show-sql = true 
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.naming- 
strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect = 
org.hibernate.dialect.MySQL5Dialect
server.port=8081

我试图更改 CrudRepository 中的 JpaRepository 但同样的问题同样的错误是 QueryByExampleExecutor 类型中的方法 findOne(Example) 不适用于参数(Long) 我试图将方法更改为 getOne() 但并不完美 我之前已经使用过这种方法,但这次它不起作用我不知道为什么在同一个编辑器中。我很清楚我还没有解决这类问题的技术,因为我要求你展示给我的经验或者由于问题,提前感谢你的帮助:)

【问题讨论】:

您使用了旧版本的 spring-data-jpa,它有一个 findOne() 方法。现在您正在使用更新的版本,它不再具有它。就如此容易。 findById() 是您应该在较新版本中使用的内容。阅读该死的 javadoc。这就是它的用途。 @JBNizet 你知道有没有 Spring Data JPA 2.x 的迁移指南吗?在打开 2.1.3 版本的文档时,docs.spring.io/spring-data/jpa/docs/2.1.3.RELEASE/reference/…,它只提到了 1.10 和 1.11 的变化:/ 打破兼容性甚至没有提到任何地方都非常奇怪...... 【参考方案1】:

使用findById() 代替findOne()

【讨论】:

【参考方案2】:

根据要求尝试使用以下 2 个选项:-

yourRespository.findById(id).get();// it will return an Optional instead of null

yourRespository.findById(id).orElse(null); // this will return null if you have proper null checks

spring data jpa 的最新版本发生了一些变化,他们删除了之前使用 work 的 findOne() 方法。你可以在这里查看帖子以供参考 - https://***.com/a/44103020/2600196

或者恢复到旧的 spring data jpa 版本

【讨论】:

你也可以在这里参考答案-***.com/a/44103020/2600196 我已经在同一个编辑器中用过这个方法findOne() 用java 8和apache 8 Exlips。我可以更新我的软件吗? 你最近升级了pom.xml 中的任何依赖项

以上是关于无法在我的 JpaRepository 代码中使用 findOne() [重复]的主要内容,如果未能解决你的问题,请参考以下文章

jparepository 无法解析为类型

JpaRepository 连接问题,无法通过登录找到用户

带有可选参数的 JpaRepository

如何使用 Spring Data 获取数据

CrudRepository findOne()和JpaRepository getOne()之间的区别

CrudRepository findOne() 和 JpaRepository getOne() 的区别