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 :

Alias dans une sous-requête [Criteria]


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut Alias dans une sous-requête
    Bonsoir,

    Je produis une sous-requête count à l'aide du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DetachedCriteria subqueryEventProfileRoleActors = DetachedCriteria.forClass(Actor.class, "act");
    subqueryEventProfileRoleActors.createAlias("act.roles", "actRoles");
    subqueryEventProfileRoleActors.add(Restrictions.eq("actRoles.code", eventProfile));
    subqueryEventProfileRoleActors.add(Subqueries.in("act.id", subqueryEventProfileIntActors));
    subqueryEventProfileRoleActors.setProjection(Projections.count("act.id"));
    et le code SQL généré produit toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(act_.ActID) as y0_
    ...
    Quelque chose m'échappe, comment changer ce y0_ ???

    Merci pour vos suggestions.

  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
    Et pourquoi veux tu agir sur le SQL généré ?

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    J'ai en effet indiqué un mauvais exemple.

    Comment puis-je voir les paramètres dans les requêtes Hibernate (à la place des ?)

    Merci.

  4. #4
    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
    Il faut configurer ton outil de log avec le bon paramètre.
    Tu trouveras comment faire dans la documentation d'Hibernate.

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    Nous utilisons Sybase ASE 15 et Hibernate 3.6.1.Final.

    Nous avons une erreur dès qu'un alias est positionné dans une sous requête.

    Extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    and xxx in (select intactacto2_.ActID as y0_
    ...
    si je retire ce AS de la requête générée, ça fonctionne.

    Comment dire à Hibernate de ne pas générer cet alias ?

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    tu as positionné le paramètre "hibernate.dialect" à la bonne valeur ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    tu as positionné le paramètre "hibernate.dialect" à la bonne valeur ?
    La configuration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <prop key="hibernate.dialect">org.hibernate.dialect.SybaseASE15Dialect</prop>
    Nous sommes sur une base 15.5, il semble que cette version du SGBD ne supporte pas les alias dans les sous-requêtes.
    Il semble que ce soit corrigé en Sybase ASE 15.7 mais il n'est pas prévu de mise à jour chez nous. Reste à trouver une astuce de contournement...

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    J'ai pu m'en sortir en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Projections.sqlProjection
    afin de générer le code souhaité.

    Après avoir tracé les requêtes et les paramètres utilisés, la requête fonctionne dans mon client SQL mais me renvoit toujours 0 dans mon code...

  9. #9
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    J'ai compris la différence de comportement entre le code et l'exécution dans un client SQL.

    Dans la génération de ma sous requête, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DetachedCriteria subqueryEventProfileIntActors = DetachedCriteria.forClass(IntActor.class, "intAct");
    subqueryEventProfileIntActors.createAlias("intAct.interaction", "intActInteraction");
    subqueryEventProfileIntActors.add(Restrictions.eq("intActInteraction.id", "this_.intID"));
    J'aimerais que "this_.intID" corresponde à l'attribut id de l'entité gérée par le Criteria "parent". Est-ce possible ?

    Criteria "parent" (la requête principale) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Criteria criteria = session.createCriteria(Interaction.class);
    Dans mon client, je remplace un paramètre ? par this_.intID alors que côté Hibernate il doit le résoudre en 'this_.intID' ce qui explique que rien ne soit renvoyé.

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    J'ai revu la requête, j'ai désormais quelque chose qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Criteria criteria = session.createCriteria(Interaction.class, "i");
    // generation de la subquery par DetachedCriteria
    criteria.add(Subqueries.in("i.id", maSubQueryr));
    Le problème est que la clause select créée par la sous-requête genère un alias...qui n'est pas supporté en Sybase ASE 15.5.

    Je suis en train d'essayer avec Projections.sqlProjection mais je ne dois pas le faire correctement car la requête me renvoie toujours 0 résultats.

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    Projections.sqlProjection("intAct_.MvaColID", new String[] {null}, new Type[] { StandardBasicTypes.STRING})
    ...
    J'obtiens dans ma console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    and this_.IntID in (
                select
                    intAct_.MvaColID
                from
    ...
    Mais aucun résultat (alors que je sais que les paramètres dynamiques sont bindés avec les bonnes valeurs)

    Je pense qu'en réalité, la requête hibernate utilisée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    and this_.IntID in (
                select
                    'intAct_.MvaColID'
                from
    ...
    this_.IntID et intAct_.MvaColID sont de type char(16).

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    A ta place, je passerais par une requête native avec un addEntity, beaucoup plus simple...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 143
    Par défaut
    Ok, problème résolu avec Restrictions.sqlRestriction et une requête en SQL natif.

    Merci pour vos infos.

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

Discussions similaires

  1. Order by dans une sous requête
    Par KRis dans le forum SQL
    Réponses: 7
    Dernier message: 31/10/2008, 15h29
  2. inserer un critere dans une sous requête
    Par Myogtha dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/02/2008, 16h53
  3. Passer un paramètre dans une sous-requête
    Par Lucier dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2007, 10h07
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54

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