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 Java Discussion :

Spring DATA mot clé


Sujet :

Spring Java

  1. #1
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut Spring DATA mot clé
    Bonjour tout le monde,

    Je voudrais faire une requête avec les mots-clés de Spring Data, mais je n'y arrive pas.
    Dans les grandes lignes, j'ai une classe user qui contient une liste de projet.
    Et je voudrais récupérer une liste d'utilisateurs qui n'ont pas ce projet. Sachant bien sûr qu'un user peut avoir plusieurs projets.
    Je suis partie sur quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Set<UserProjectionSkillProject> findByLstProjectUsersProjectIdNotContaining(Long pId);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Set<UserProjectionSkillProject> findByLstProjectUsersNotContainingProjectId(Long pId);
    Mais ça ne fonctionne pas.
    La requête sql qui fonctionne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Query(value = "SELECT u.id, u.first_name FROM user u WHERE u.id NOT IN (SELECT u.id FROM project_user pu WHERE pu.project_id = ?1 AND pu.user_id = u.id", nativeQuery = true)
    Mais j'aimerai (pour monter en compétence sur les mots clés de Spring data) ne pas la faire en sql.

    Des idées, propositions ?

    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 256
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    En faisant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.example.demo;
     
    import org.springframework.data.jpa.repository.JpaRepository;
     
    import java.util.List;
     
    public interface UserRepository extends JpaRepository<UserEntity, String> {
     
        List<UserProjection> findAllByProjects_IdNotIn(List<String> projectIds);
    }
    ATTENTION que la requête générée en base de données fera un left outer join entre la table de UserEntity et de ProjectEntity ce qui aura pour conséquence de ne pas renvoyer les utilisateurs qui ne sont pas liés à un projet.

    Explications :

    findAll permet de dire que l'on fait une recherche (le mot clé all peut être omit)
    By pour signaler que ce qui suit sera les différentes conditions (le where en SQL)
    Projects_Id pour indiquer que l'on souhaite définir un filtre sur le champ id présent dans le type de l'objet du champ projects de l'entité UserEntity.
    NotIn exactement comme le NOT IN en SQL
    (List<String> projectIds) pour donner une liste d'identifiants de projets à exclure

    Documentation : https://docs.spring.io/spring-data/j...ty-expressions

    Et voici le code exemple que je me suis fait :
    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
    package com.example.demo;
     
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.stereotype.Component;
     
    import java.util.Collections;
    import java.util.List;
     
    @SpringBootApplication
    public class DemoApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
     
        @Component
        public static class InitRunner implements ApplicationRunner {
     
            private final UserRepository userRepository;
            private final ProjectRepository projectRepository;
     
            public InitRunner(UserRepository userRepository, ProjectRepository projectRepository) {
                this.userRepository = userRepository;
                this.projectRepository = projectRepository;
            }
     
            @Override
            public void run(ApplicationArguments args) {
                ProjectEntity projectEntityA = new ProjectEntity();
                projectEntityA.setId("a");
                projectEntityA.setName("A");
                projectRepository.save(projectEntityA);
     
                ProjectEntity projectEntityB = new ProjectEntity();
                projectEntityB.setId("b");
                projectEntityB.setName("B");
                projectRepository.save(projectEntityB);
     
                UserEntity userEntityA = new UserEntity();
                userEntityA.setId("a");
                userEntityA.setFirstName("A");
                userEntityA.setProjects(Collections.singletonList(projectEntityA));
                userRepository.save(userEntityA);
     
                UserEntity userEntityB = new UserEntity();
                userEntityB.setId("b");
                userEntityB.setFirstName("B");
                userEntityB.setProjects(Collections.singletonList(projectEntityB));
                userRepository.save(userEntityB);
     
                UserEntity userEntityC = new UserEntity();
                userEntityC.setId("c");
                userEntityC.setFirstName("c");
                userEntityC.setProjects(Collections.singletonList(projectEntityB));
                userRepository.save(userEntityC);
     
                List<UserProjection> all = userRepository.findAllByProjects_IdNotIn(Collections.singletonList("b"));
     
                all.forEach(userProjection -> System.out.println(userProjection.getFirstName()));
            }
        }
    }
    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
    package com.example.demo;
     
    import javax.persistence.Entity;
    import javax.persistence.Id;
     
    @Entity
    public class ProjectEntity {
     
        @Id
        private String id;
     
        private String name;
     
        public String getId() {
            return id;
        }
     
        public void setId(String id) {
            this.id = id;
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package com.example.demo;
     
    import org.springframework.data.jpa.repository.JpaRepository;
     
    public interface ProjectRepository extends JpaRepository<ProjectEntity, String> {
    }
    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
    package com.example.demo;
     
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import java.util.List;
     
    @Entity
    public class UserEntity {
     
        @Id
        private String id;
     
        private String firstName;
     
        @ManyToMany
        private List<ProjectEntity> projects;
     
        public String getId() {
            return id;
        }
     
        public void setId(String id) {
            this.id = id;
        }
     
        public String getFirstName() {
            return firstName;
        }
     
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
     
        public List<ProjectEntity> getProjects() {
            return projects;
        }
     
        public void setProjects(List<ProjectEntity> projects) {
            this.projects = projects;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package com.example.demo;
     
    public interface UserProjection {
     
        String getFirstName();
    }

  3. #3
    Membre habitué Avatar de Badshade23
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2014
    Messages : 203
    Points : 133
    Points
    133
    Par défaut
    Merci pour ta réponse
    Après plusieurs tests et essais j'ai fini par repartir vers du SQL basique avec le nativeQuery , car les requêtes générées par SpringData via les mots clés etc sont loin d'être performantes ( plusieurs appels en BDD alors que un seul suffit ....).

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur en génie logiciel
    Inscrit en
    Juin 2012
    Messages
    912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en génie logiciel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 912
    Points : 2 604
    Points
    2 604
    Par défaut
    les requêtes par mot clé c'est pratique quand la requête est simple autrement faut passer par l'annotation query et utiliser du jpql..

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

Discussions similaires

  1. [Framework] Spring data vs Spring mvc
    Par the_finisher dans le forum Spring
    Réponses: 2
    Dernier message: 09/10/2014, 11h22
  2. Spring DATA - JPQL
    Par anakin59490 dans le forum Spring
    Réponses: 0
    Dernier message: 08/04/2014, 10h29
  3. Réponses: 0
    Dernier message: 31/07/2013, 12h56
  4. [Spring data JPA] - Persister des objets managed et detached
    Par DevForFun dans le forum Persistance des données
    Réponses: 1
    Dernier message: 15/06/2013, 15h15

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