Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoi d'aide Requête JPQL

gestion de tours de garde

Sujet résolu
    14 novembre 2017 à 18:59:56

    Bonjour je bloque depuis quelques jours sur un problème mi-java mi-sql.

    Je vous explique plus en détail je travail sur un projet de gestion de tours de garde, l'appli fonctionne plus ou moins bien cependant j'ai besoin, pour continuer, d'une requête JPQL.

    Pour l'archi du projet, je l'ai fait comme ceci :

    JAVA :

    -Une classe Personnel possedant entre autre une liste d'indisponibilité

    -Une classe indisponibilité possedant un motif(enum) ainsi qu'une date de debut et de fin (LocalDateTime) enregistré en DateTime sur MySQL

    -Une classe tTourDeService qui possède un personnel, une date de debut et une date de fin (toujours en LocalDateTime)

    MySQL:

    -Toutes les tables (PERSONNEL, TOUR_DE_SERVICE, PERSONNEL_INDISPONIBILITE) sont definis par des clès primaires "UUID"

    Voilà ma question j'aimerai faire une requête JPQL permettant de lister les personnels admissible à un tour de service passé en paramètre.

    Ce que j'ai pour le moment (qui ne fonctionne pas evidemement ) :

    	public List<Personnel> listerPersonnelsDisponible(TourDeService tds) {
    		
    		TypedQuery<Personnel> tq = em.createQuery("SELECT p FROM Personnel p, Indisponibilite i WHERE (:param NOT BETWEEN i.dateDebutIndispo AND i.dateFinIndispo) AND (:param2 NOT BETWEEN i.dateDebutIndispo AND i.dateFinIndispo) AND i IN (p.indisponibilitees)",Personnel.class);
    		tq.setParameter("param", tds.getDateHeureDebut());
    		tq.setParameter("param2", tds.getDateHeureFin());
    		List<Personnel> lstRetour = tq.getResultList();
    		for (Personnel p : lstRetour) {
    			System.out.printf("%s", p.getNom());
    		}
    		return tq.getResultList();}

    Merci de vos réponse !

    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2017 à 19:09:32

      Ta requête jpql devrait plus un truc du genre:

      SELECT p FROM Personnel p
      JOIN p.indisponibilitees i
      WHERE (:param NOT BETWEEN i.dateDebutIndispo AND i.dateFinIndispo) AND (:param2 NOT BETWEEN i.dateDebutIndispo AND i.dateFinIndispo)



      • Partager sur Facebook
      • Partager sur Twitter
        14 novembre 2017 à 19:17:54

        Ok je viens d'essayer ta requêtes elle me renvoi la liste de toutes les personnes qui ont des indisponnibilitées 8 fois ...
        • Partager sur Facebook
        • Partager sur Twitter
          14 novembre 2017 à 19:24:40

          Rajoute un distinct et ça devrait être bon

          -
          Edité par florent m 14 novembre 2017 à 19:25:04

          • Partager sur Facebook
          • Partager sur Twitter
            14 novembre 2017 à 19:28:47

            Je viens de tester et il s'avère que le problème est que je n'ai que les personnels indisponible à n'importe quelle date, ce que je voudrai c'est que en passant juste le TourDeService (qui contient une date de debut et une date de fin) j'ai la liste des personnes disponibles à ce moment, en prenant en compte leur liste d'indisponibilité.
            • Partager sur Facebook
            • Partager sur Twitter
              14 novembre 2017 à 20:07:03

              Tu peux inverser tes between (mettrent un or entre les deux), faire un left join au lieu d'un join et rechercher et ne prendre que seux pour lesquel i est null (j'ai pas d'ordi pour tester, donc je ne sait pas si ça fonctionne)
              • Partager sur Facebook
              • Partager sur Twitter
                14 novembre 2017 à 20:17:06

                Non ça ne fonctionne pas mais merci pour ton aide
                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2017 à 8:52:56

                  Tu peux essayer de faire ce que tu veux avec un HAVING:

                  SELECT p FROM Personnel p
                  LEFT JOIN p.indisponibilitees i
                  WHERE (:param BETWEEN i.dateDebutIndispo AND i.dateFinIndispo) AND (:param2 BETWEEN i.dateDebutIndispo AND i.dateFinIndispo)
                  GROUP BY p
                  HAVING COUNT(i) < 1



                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2017 à 10:10:26

                    Bonjour,

                    Voici comment je ferais. Un personnel est dispo si toutes si toutes ses indisponibilités sont disjointes du tour de service. En pseudocode, ça donnerait ça

                    selectionner p
                    de Personnel
                    où toutes les indisponibilités i avec (i.personnelId = p.Id) vérifient (i et tour de service sont disjoints)
                    

                    Et deux intervalles i1 et i2 sont disjoints si i1.fin <= i2.debut ou i1.debut >= i2.fin

                    -
                    Edité par brubru777 15 novembre 2017 à 10:19:44

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 novembre 2017 à 13:29:14

                      Oui là ça fonctionne merci !
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Besoi d'aide Requête JPQL

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown