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

Hibernate Java Discussion :

Aide sur une requete hql facile


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut Aide sur une requete hql facile
    Bonjour, je travail actuellement sur une requete Hibernate. Jusqu'a présent j'utilisé dans mon application en développement la construction d'une liste d'objet hibernate, car j'ai des difficultées à monter cette requête.

    Je doit récupérer une liste d'évènements qui peuvent être attribué à un utilisateur, mais sur plusieurs niveaux. Dans les faits, un évènements peut appartenir à un User, à un Course, à un Campus et à une University, ce sont des relations n à n.
    Dans mon modèle, et vous comprendrez en lisant le code, que je souhaite récupérer les evenements qui se déroule entre 2 dates ( from et to ) d'un utilisateur, les évènements des cours que possède la promotion de cet utilisateur, les évènements du campus dans lequel est inscrit sa promotion puis les évènements de l'université dans laquelle est inscrit le campus.

    Voici la requete que j'ai constituer qui réalise ce que je souhaite, mais en java et non en sql :

    Code java : 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
     
    List<Event> events = new ArrayList<Event>();
    final User u = (User) session.get(User.class, user.getUsername());
    //get user events
    addToEventList(events, u.getEvents(), from, to);
    //get user.promotion.courses events
    for(Course c : u.getPromotion().getCourses()){
            addToEventList(events, c.getEvents(), from, to);
    }
     
    //get user.promotion.campus events
    //events.addAll(u.getPromotion().getCampus().getEvents());
    addToEventList(events, u.getPromotion().getCampus().getEvents(), from, to);
     
    //get user.promotion.campus.university events				//events.addAll(u.getPromotion().getCampus().getUniversity().getEvents());
     
    Comparator<Event> sortStartDate = new Comparator<Event>() {
     
    		@Override
    		public int compare(Event o1, Event o2) {
    			return o1.getStartDate().compareTo(o2.getStartDate());
    		}
    	};
    	Collections.sort(events,sortStartDate);
    	return events;

    J'ai aujourd'hui un bout de requete qui fonctionne, elle remplace le u.getEvents() :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String hql = "SELECT distinct(event) " +
    	        "FROM User user " +
    		"INNER JOIN user.events event " +
    		"WITH event.startDate >= :from AND event.startDate <= :to "+
    		"order by event.startDate";
    		Query query = session.createQuery(hql);
    		query.setDate("from", from);
    		query.setDate("to", to);
    		List list = query.list();
    		return list;

    J'aimerais maintenant constituer une requête qui remplace entièrement la construction manuel de ma liste en étendant ma requête hql, dans l'idée ce pourrait être comme ça, même si je sais que ca ne fonctionne pas :

    Code java : 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
     
    String hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "INNER JOIN user.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    				"INNER JOIN user.promotion.courses.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    				"INNER JOIN user.promotion.campus.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    				"INNER JOIN user.promotion.campus.university.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    				 "order by event.startDate";
    				Query query = session.createQuery(hql);
    				query.setDate("from", from);
    				query.setDate("to", to);
    				List list = query.list();
    				return list;

    J'espère avoir était clair, ce n'est pas évidement à expliquer. Avez vous une idée de la requête qui pourrait résoudre mon problème ? Suis je sur la bonne voie ?

    Merci d'avance !

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Par défaut
    Bonjour, j'utilise aujourd'hui un enchainement de requete pour constituer ma liste, mais je suis loin d'être satisfait. Il ne me manque pas grand chose, c'est juste que j'aimerais exécuter ces requêtes en une seule.

    Code java : 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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
                                     final List<Event> events = new ArrayList<Event>();
                                     String hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "ORDER BY event.startDate";
    				Query query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				List list = query.list();
    				events.addAll(list);
     
     
    				//get user.promotion.studyPeriods events
    				hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.promotion.studyPeriods sp JOIN sp.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "order by event.startDate";
    				query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				list = query.list();
    				events.addAll(list);
     
    				//get user.promotion.courses events
    				hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.promotion.courses course JOIN course.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "order by event.startDate";
    				query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				list = query.list();
    				events.addAll(list);
     
    				//get user.promotion events
    				System.out.println("dfs");
    				hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.promotion p JOIN p.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "order by event.startDate";
    				query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				list = query.list();
    				events.addAll(list);
     
    				//get user.promotion.campus events
    				hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.promotion.campus c JOIN c.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "order by event.startDate";
    				query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				list = query.list();
    				events.addAll(list);
     
    				//get user.promotion.campus.university events
    				hql = "SELECT distinct(event) " +
    				 "FROM User user " +
    				 "JOIN user.promotion.campus.university u JOIN u.events event " +
    				 	"WITH event.startDate >= :from AND event.startDate <= :to "+
    			 	 "WHERE user.username = :username " +
    				 "order by event.startDate";
    				query = session.createQuery(hql);
    				query.setParameter("username", user.getUsername());
    				query.setDate("from", from);
    				query.setDate("to", to);
    				list = query.list();
    				events.addAll(list);
     
    				Comparator<Event> sortStartDate = new Comparator<Event>() {
     
    					@Override
    					public int compare(Event o1, Event o2) {
    						return o1.getStartDate().compareTo(o2.getStartDate());
    					}
    				};
    				Collections.sort(events,sortStartDate);

    Je précise que les relations de mes entitées avec leurs "Events" est unidirectionnel, l'évènement ne connait donc pas sont propriétaire.

    Avez vous, s'il vous plaît une idée pour fusionner ces requêtes en une seule, merci !!

Discussions similaires

  1. [Debutant] Aide sur une requete normée
    Par Wisefool dans le forum Oracle
    Réponses: 2
    Dernier message: 14/04/2006, 18h41
  2. Besoin d'aide sur une requete ds un trigger
    Par ideal dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 15/02/2006, 10h05
  3. [MySQL] aide sur une requete
    Par dj-julio dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/01/2006, 14h25
  4. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  5. Aide sur une requete de sélection
    Par stephdiplo150 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/01/2004, 10h40

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