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 !