web-dev-qa-db-fra.com

Impossible d'utiliser findOne () dans mon code avec JpaRepository

J'ai un projet avec la classe 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();
    }
}

et l'interface de PersonRepository est ici

package com.example.repositories;

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

public interface IPersonneRepository extends JpaRepository<Personne, Long> {    

}

Et dans le contrôleur, j'ajoute la méthode de CRUD (créer, lire, mettre à jour et supprimer) ces méthodes sont dans cette classe

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

    }
}

le fichier application.properties est

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

J'ai essayé de changer le JpaRepository dans CrudRepository mais le même problème, la même erreur est La méthode findOne (Example) dans le type QueryByExampleExecutor n'est pas applicable pour les arguments (Long) j'ai essayé de changer la méthode pour getOne () mais ce n'est pas parfait j'ai déjà utilisé cette méthode avant mais cette fois ça ne marche pas je ne sais pas pourquoi dans le même éditeur. Je sais très bien que je n'avais pas encore les techniques pour résoudre ce genre de problème à cause de l'expérience que je vous demande de me montrer ou à cause du problème et merci d'avance pour l'aide :)

4
BMW83

Essayez d'utiliser les 2 options suivantes en fonction de l'exigence: -

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

Il y a eu quelques changements avec les versions récentes de Spring Data JPA et ils ont supprimé la méthode findOne() qui utilisait le travail plus tôt. vous pouvez consulter le post ici pour référence - https://stackoverflow.com/a/44103020/2600196

Ou revenir à l'ancienne version jpa des données du printemps

9
kakabali

Utilisez findById() au lieu de findOne().

0
Christopher