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

JPA Java Discussion :

Convertir des clauses CASE WHEN dans un SELECT en JPQL


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Par défaut Convertir des clauses CASE WHEN dans un SELECT en JPQL
    Bonjour,

    Je n'arrive pas à écrire en JPQL une requête qui contient des SELECT dans une clause CASE WHEN.
    Pouvez vous me dire comment écrire en JPQL la requête suivante ?
    (Chaque sous select retourne un résultat unique).

    Code : 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
     
     
    SELECT contenuRL.TITLE, OBJECT_TYPE, bm.TITLE,
            (CASE WHEN contenuRL.BUSINESS_MODEL = 2  
                 THEN (SELECT ch.CHANNEL_NAME
                       FROM v_provider_Channel ch
                       WHERE (ch.channel_id = contenuRL.SERVICE_ID)
                      )
                 WHEN contenuRL.BUSINESS_MODEL = 3
                  THEN (SELECT nt.NETWORK_NM
                        FROM v_provider_Network nt
                        WHERE nt.network_id = contenuRL.SERVICE_ID
                      )
                 WHEN contenuRL.BUSINESS_MODEL in (4, 5)
                  THEN (SELECT sr.NAME
                        FROM IS_SERVICE sr
                        WHERE sr.ID = contenuRL.SERVICE_ID
                      )
                 ELSE NULL  
            END) AS chaine,
    contenuRL.code_groupe,
    contenuRL.group_definition
    FROM IS_RL_LINK_DEF contenuRL
    LEFT JOIN is_business_model bm on contenuRL.BUSINESS_MODEL = bm.ID
    ORDER BY contenuRL.TITLE, contenuRL.OBJECT_TYPE, bm.TITLE;
    Merci .

  2. #2
    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
    La requête que tu montres peut s'exécuter via un query natif, pourquoi s'embêter ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    entityManager.createNativeQuery(" ta requête ");
    ...
    Sinon, avec les Entity, il faudrait passer par l'héritage. Avec un @discriminator (qui correspondrait à ta colonne BUSINESS_MODEL) sur la table principale et des @DiscriminatorValue (qui correspondrait à tes valeurs testées) pour chaque table de spécialisation... bref... plus compliqué...
    Mais tu peux regarder ici pour voir ce qu'il est possible de faire
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Par défaut
    Merci pour ta réponse. Je suis passé par une requête native en attendant.

    Citation Envoyé par OButterlin Voir le message
    La requête que tu montres peut s'exécuter via un query natif, pourquoi s'embêter ?
    Je voulais passer par du JPQL car je voulais remplir directement dans le select un DTO en utilisant un constructeur (Select new ContenuRLDTO(...)) ; et utiliser les objets Entity (Channel, Network et Service) directement depuis les sous-requêtes du CASE WHEN. Ainsi, j'aurais évité de me taper une List<Object[]> à cause de la requête native et de recharger plus tard ces objets avec un nouveau appel BD.

    J'ai longtemps cherché sans trouver de résultat. JPQL a beaucoup de restrictions sur les SELECT imbriqués et je ne sais pas si finalement c'est faisable en JPQL.

    J'ai regardé ta solution d'héritage, mais ça ne répond pas à mon besoin. Déjà que je ne peux pas toucher au schéma BD.

    Je suis ouvert à toute proposition si quelqu'un a déjà résolu ce problème.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Par défaut
    Voila ce que j'avais comme requête mais qui ne fonctionnait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT new ContenuRlDTO(contenuRl.title, contenuRL.objectType, bm.title, 	
    	(CASE WHEN contenuRL.idBusinessModel = 2      
    		THEN (SELECT ch FROM Channel ch WHERE ch.id = contenuRL.serviceId)      
    	WHEN contenuRL.idBusinessModel = 3           
    		THEN (SELECT nt FROM Network nt WHERE nt.id = contenuRL.serviceId)      
    	WHEN contenuRL.idBusinessModel  in (4, 5)      
    		THEN (SELECT sr FROM Service sr WHERE sr.id = contenuRL.serviceId)      
    	ELSE NULL     
    	END) as typeChaine,     
    	contenuRL.codeGroupe, contenuRL.groupDefinition) 
    FROM RlLinkDef contenuRL 
    LEFT JOIN contenuRL.businessModel bm 
    ORDER BY contenuRL.title, contenuRL.objectType, bm.title ;

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Comme disais OButterlin, tu peux déjà partir avec la requête sql native que tu as déjà en attendant que tu t'y habitues sur les discriminator. Si le cible n'est pas un entité, tu utilises SqlResultSetMapping, sinon, tu peux passer directement la class de l'entité cible en paramètre.

    A+.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Bonjour,

    Comme disais OButterlin, tu peux déjà partir avec la requête sql native que tu as déjà en attendant que tu t'y habitues sur les discriminator. Si le cible n'est pas un entité, tu utilises SqlResultSetMapping, sinon, tu peux passer directement la class de l'entité cible en paramètre.

    A+.
    Voir https://vladmihalcea.com/the-best-wa...and-hibernate/ pour un aperçu des différentes manières de faire.

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/11/2010, 08h33
  2. plusieur case dans un select
    Par dirty_harry dans le forum SQL
    Réponses: 2
    Dernier message: 08/01/2010, 12h05
  3. Convertir des données présentes dans une colonne
    Par padawan31 dans le forum MySQL
    Réponses: 1
    Dernier message: 16/07/2009, 11h11
  4. [MySQL] Comment faire le tri des membres actifs dans un SELECT
    Par pasc06 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 27/11/2008, 14h00
  5. Interbase: Problème de case dans un SELECT
    Par mameziane dans le forum InterBase
    Réponses: 16
    Dernier message: 18/11/2007, 11h34

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