IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

rechercher tous les tuples appartenant à une cléf étrangère


Sujet :

Spring Boot Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut rechercher tous les tuples appartenant à une cléf étrangère
    Bonjour,

    voici une table de donnée qui contient le nom des routes et sa cléf étrangère:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     select * from matiere;
    +----+--------------+---------+-------------+
    | id | name_matiere | route   | sommaire_id |
    +----+--------------+---------+-------------+
    |  1 | aquarel      | aquarel |           1 |
    |  2 | aq2          | aq2     |           1 |
    |  3 | paysage      | paysage |           2 |
    +----+--------------+---------+-------------+

    je souhaite rechercher tous les noms des route ayant comme sommmaire_id = 1

    voici mes 2 entités:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Matiere implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String nameMatiere;
        private String route;
        @ManyToOne
        private Sommaire sommaire;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Sommaire implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
     
        private String nameSommaire;
        private String route;
     
            //un sommaire peut avoir plusieur matieres
            @OneToMany(mappedBy = "sommaire")
            private Collection<Matiere> matieres = new ArrayList<>();
     
    }
    voici mon dao

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @RepositoryRestResource
    public interface MatiereRepository extends JpaRepository<Matiere, Long> {
        public Matiere findByNameMatiere(String nameMatiere);
        @RestResource(path="/byRoute")
        public List<Matiere> findBySommaire(@Param("rt") String sommaire);
     
     
    }
    lorsque que je regarde cette page des matières voici ce que je vois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    {
      "_embedded" : {
        "matieres" : [ {
          "nameMatiere" : "aquarel",
          "route" : "aquarel",
          "_links" : {
            "self" : {
              "href" : "http://localhost:8181/matieres/1"
            },
            "matiere" : {
              "href" : "http://localhost:8181/matieres/1"
            },
            "sommaire" : {
              "href" : "http://localhost:8181/matieres/1/sommaire"
            }
          }
        }, {
          "nameMatiere" : "aq2",
          "route" : "aq2",
          "_links" : {
            "self" : {
              "href" : "http://localhost:8181/matieres/2"
            },
            "matiere" : {
              "href" : "http://localhost:8181/matieres/2"
            },
            "sommaire" : {
              "href" : "http://localhost:8181/matieres/2/sommaire"
            }
          }
        }, {
          "nameMatiere" : "paysage",
          "route" : "paysage",
          "_links" : {
            "self" : {
              "href" : "http://localhost:8181/matieres/3"
            },
            "matiere" : {
              "href" : "http://localhost:8181/matieres/3"
            },
            "sommaire" : {
              "href" : "http://localhost:8181/matieres/3/sommaire"
            }
          }
        } ]
      },
      "_links" : {
        "self" : {
          "href" : "http://localhost:8181/matieres{?page,size,sort}",
          "templated" : true
        },
        "profile" : {
          "href" : "http://localhost:8181/profile/matieres"
        },
        "search" : {
          "href" : "http://localhost:8181/matieres/search"
        }
      },
      "page" : {
        "size" : 20,
        "totalElements" : 3,
        "totalPages" : 1,
        "number" : 0
      }
    }
    dans le dictionnaire je ne vois pas ma recherche "findBySommaire"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        public List<Matiere> findBySommaire(@Param("rt") String sommaire);
    quel est le code à mettre et ou le mettre pour obtenir mon résultat des nom des routes(mettre la méthode findBySommaire dans le reposirtory de matière est t'il bon ?
    quel est la bonne url pour obtenir le nom des "route" en ayant le numéro id_sommaire ?


    merci de vos réponses ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    j'ai tenté ceci mais cela ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public List<Matiere> findBySommaire_id(Integer sommaire);
     
    //matiereRepository.findBySommaire_id(1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     SELECT * FROM MATIERE WHERE sommaire_id;
    +----+--------------+---------+-------------+
    | id | name_matiere | route   | sommaire_id |
    +----+--------------+---------+-------------+
    |  1 | aquarel      | aquarel |           1 |
    |  2 | aq2          | aq2     |           1 |
    |  3 | paysage      | paysage |           2 |
    +----+--------------+---------+-------------+
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.2.0.M3.jar:2.2.0.M3]
    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [1] did not match expected type [java.lang.Long (n/a)];
    nested exception is java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [java.lang.Long (n/a)]
            at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:373) ~[spring-orm-5.2.0.M2.jar:5.2.0.M2]
    j'ai essayer d'une requête manuel mais cela ne fonctionne pas aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface MatiereRepository extends JpaRepository<Matiere, Long> {
        public Matiere findByNameMatiere(String nameMatiere);
        @Query("select m from Matiere m where m.sommaire_id like :x")
        public List<Matiere> chercher(@Param("x") Integer idSommaire);
     
    //		matiereRepository.chercher(1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List ohkod.sklt.dao.MatiereRepository.chercher(java.lang.Integer)!

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public List<Matiere> findBySommaireId(Long sommaireId);
    Attention au type que tu utilises.

    A+.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de ta réponse,

    j'ai choisi de faire une requête manuel:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public interface MatiereRepository extends JpaRepository<Matiere, Long> {
        public Matiere findByNameMatiere(String nameMatiere);
        @Query("select m from Matiere m where m.sommaire =:id")
        public List<Matiere> chercher(@Param("id") int x);
     
    }

    Quand je ne fais pas appel à la méthode "chercher" dans mon string main, je n'ai pas d'erreur, mais si je tente de faire appel à chercher, j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [1] did not match expected type [ohkod.sklt.entities.Sommaire (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [ohkod.sklt.entities.Sommaire (n/a)]

    on va dire que je reçois un numéro id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		matiereRepository.chercher(1).forEach(x ->{
    			System.out.println("query ====");
    			System.out.println(x.getNameMatiere());
    		}
    je redonne mon entité sommaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Matiere implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String nameMatiere;
        private String route;
        @ManyToOne
        @JoinColumn(name="sommaireId")
        private Sommaire sommaire;
    }
    Est ce que ma requête est bonne ?
    est ce que mettre int est bon ?

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Est ce que ma requête est bonne ?
    est ce que mettre int est bon ?
    T'as bien vu que rien ne fonctionne. Tu commences à être lourd, comme si t'as pas lu ma réponse, à vouloir tout tester sans essayer à comprendre tu n'y arriveras à rien. Le code que j'ai proposé devrait fonctionner avec tes mapping du début.

    Citation Envoyé par andry.aime
    Attention au type que tu utilises.
    Au début, tu as des types Long mais tu passes un Integer en paramètre.
    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [1] did not match expected type [java.lang.Long (n/a)];
    Maintenant, tu passes un int or que c'est un type Sommaire qui est attendu
    Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [1] did not match expected type [ohkod.sklt.entities.Sommaire (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [1] did not match expected type [ohkod.sklt.entities.Sommaire (n/a)]
    Si tu veux utiliser du JPQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     @Query("select m from Matiere m where m.sommaire.id =:id")
     public List<Matiere> chercher(@Param("id") Long x); // attention au type
    // Pour une requête native
    @Query("select * from matiere m where m.sommaire_id =:id", nativeQuery=true) 
        public List<Matiere> chercherNative(@Param("id") Long x);

    A+.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    merci de la réponse,

    justement je pensais que faire une requête manuelle pouvais outrepasser le type sommaire(sans findBy).
    j'ai donc aussi essayer avec le natif query comme tu me l'a donnée:


    cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public void run(String... args) throws Exception {
    		this.st();
    		Logger logger = LoggerFactory.getLogger(KodCms.class);
    		logger.info("test recup les route matiere !!!!");
     
    		matiereRepository.chercher().forEach(m -> {
    			logger.info("les routes matiere" + m.getRoute());
    		});
    	}
    j'ai été bloqué car je me suis mélanger les pinceaux entre sommaire, sommaire_id et sommaireId(car jpa le renomme ainsi avec un "_") ,
    je viens de me rendre compte que si je mets sommaireId ,il le renomme sommaire_id, du coup entre les vraie requêtes et requêts natif sont fausse.

    de plus j'avais aussi tenter de récupérer le sommaire en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Sommaire sommaire = sommaireRepository.getNameSommaire("aquarel");
    matiereRepository.findBySommaire(sommaire);
    et cela avais aussi fait un erreur, je pense que maintenant que cela fonctionne je devrais pouvoir réutiliser de findBy car j'ai les bonne requêtes.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rechercher tous les valeurs dans une reponse XML pour un specifique element
    Par ABIDIN dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 15/12/2018, 18h00
  2. Réponses: 1
    Dernier message: 22/12/2016, 09h41
  3. Recherche de tous les fichiers d'une certaine date
    Par rafuoner dans le forum Unix
    Réponses: 1
    Dernier message: 17/03/2010, 16h06
  4. Réponses: 9
    Dernier message: 21/07/2009, 17h45
  5. Réponses: 2
    Dernier message: 07/03/2006, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo