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 :

Join fetch et clause "with" [HQL]


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut Join fetch et clause "with"
    Bonjour,

    Je me casse la tête sur le problèmes suivant :

    Mon entité Technicien possède une liste de Taches qu'il effectue.
    Ces taches pouvant être nombreuse puisse qu'on en garde l'historique, le lien entre les 2 entité est déclaré lazy.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Entity
    @Table(name="TECHNICIAN")
    public class Technician {
        @OneToMany(mappedBy="technician", fetch=FetchType.LAZY)
        private Set<Task> tasks = new HashSet<Task>();
        ...
    }
    Je souhaite dans une requête obtenir tout mes techniciens et leur associer les taches qu'il ont effectuées le jour J.

    J'écris donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT tch 
    FROM Technician tch 
    LEFT JOIN FETCH tch.tasks tsk 
    WITH tsk.scheduledStartDate >= :schedStart_begin AND tsk.scheduledStartDate <= :schedStart_end 
    WHERE tch.partner=:partner
    Le problème :
    org.hibernate.hql.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
    (A noter que sans le fetch, ma requête me renvoie le résultat attendu.)

    Si je ne peux pas utiliser de clause "with" avec un "fetch", comment puis-je filtrer mes taches tout en récupérant tous mes techniciens ? (y compris ceux qui n'ont pas de tache pour ce jour là).

    en espérant trouver un peu de lumière par ici

    D'avance je vous remercie

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Désolé pour mon ignorance, mais pourquoi ne pas mettre l'équivalent du with dans la clause where ?
    Tu peux utiliser un left join, si tu veux aussi les techniciens sans taches.

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Comme le dit le message d'erreur:

    Citation Envoyé par Ghurdyl Voir le message
    use filters



    http://docs.jboss.org/hibernate/core...l/filters.html

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Merci pour vos réponses.

    @fr1man :
    Pas d'ignorance là dedans, c'était la première chose que j'ai testée avant de découvrir le mot-clé "with".
    Mais mettre l'équivalent du with dans la clause where, ne fonctionne pas. Le where s'applique sur tout les records (combinaison technician-task) après le join, ce qui fait que les records avec un technicien sans tâche (ou sans tâche pour la date donnée) se fait éjecter puisse qu'il ne satisfait pas les conditions du filtre. (En effet toute les colonnes venant de l'entité "task" sont nulles)

    @tchize_ :
    Ici c'est mon ignorance que je mets en avant, je n'utilise pas d'objet Session mais un EntityManager et ce comme dans tout mes autres DAO. Je voulais donc garder le même principe.
    Seulement, jusqu'à présent, je ne trouve pas comment spécifier un "filter" sur un EntityManager.
    Des conseils/astuces dans cette voie ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ok, alors essaie la combinaison du "where" + "left join", ça devrait le faire.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Ok, alors essaie la combinaison du "where" + "left join", ça devrait le faire.
    J'ai bien peur de ne pas comprendre
    Si tu veux dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT tch 
    FROM Technician tch 
    LEFT JOIN FETCH tch.tasks tsk 
    WHERE (tch.partner=:partner) 
    AND (tsk.scheduledStartDate >= :schedStart_begin AND tsk.scheduledStartDate <= :schedStart_end)
    Cet requête me donne le résultat évoqué précédemment, à savoir que je n'aurais que les techniciens qui ont au moins une tâche pour le jour J. Or moi je veux tout les technicien, y compris ceux sans taches.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ben le left join est censé justement te renvoyer les techniciens sans tache contrairement au join tout court.

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

Discussions similaires

  1. Variable d'une clause where avec quote
    Par kcizth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/04/2008, 15h43

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