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 :

Probleme de sous requete


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Eco
    Eco est déconnecté
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Par défaut Probleme de sous requete
    Bonjour a tous,

    J'ai une requete SQL assez complexe (enfin pour moi :p) a traduire en HQL (Hibernate). Et comme je suis bloque depuis un petit moment, je viens demader votre aide.

    Voila la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from CUSTOMER_PAYMENT cp where cp.payment_status_code=7
    and not exists (select * from CUSTOMER_PAYMENT_FLAG cpf where cpf.customer_payment_id=cp.customer_payment_id
    and payment_flag_id=1)
    Je suis arrive a ce resultat ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DetachedCriteria contents = DetachedCriteria.forClass(PaymentFlag.class, "pf").add(Expression.eq("id", 7));
     
    criteria.createCriteria("payments").add(Expression.eq("paymentStatus", 1)).add(Expression.not(Subqueries.exists(contents.setProjection(Projections.property("pf.id")))));
    ... qui bien sur ne fonctionne pas.
    En fait, je ne sais pas comment traduire ce morceau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cpf.customer_payment_id=cp.customer_payment_id
    Si quelqu'un pouvais m'aider, ca serait vraiment sympas
    Si vous avez besoin de plus d'info (structure des tables? class java?), je peux les fournir.

    Merci a vous.

    Eco

  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
    Peux-tu montrer le mapping de CUSTOMER_PAYMENT ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Eco
    Eco est déconnecté
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Par défaut
    Voici le mapping (j'ai tout mis par peur de supprimer quelqueschose d'important):

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <class name="com.scn.payment.data.CustomerPayment" table="CUSTOMER_PAYMENT" >
    		<id name="id" column="CUSTOMER_PAYMENT_ID">
    			<generator class="native" />
    		</id>
    		<!-- optimistic locking -->
    		<version name="version" column="VERSION" />
    		<!-- properties -->
    		<property name="paymentGuid" column="PAYMENT_GUID" type="string" length="36" unique="true" />
    		<property name="createdDate" column="CREATED_DATE" type="timestamp" not-null="true" />
    		<property name="updatedDate" column="UPDATED_DATE" type="timestamp" not-null="true" />
    		<property name="paymentAmount" column="PAYMENT_AMOUNT" type="big_decimal" />
    		<property name="provider" column="PROVIDER" type="string" length="12"/>
    		<property name="externalRef" column="EXTERNAL_REF" type="string" length="64"/>
    		<property name="processingFee" column="PROCESSING_FEE" type="big_decimal" />
    		<property name="description" column="DESCRIPTION" type="string" length="128"/>
    		<property name="errorCode" column="ERROR_CODE" type="string" length="10"/>
    		<property name="failureReason" column="FAILURE_REASON" type="text"/>
    		<property name="rawTransactionDetails" column="TRANSACTION_DETAILS" type="text"/>
    		<property name="vatAmount" column="VAT_AMOUNT" type="big_decimal" />
    		<property name="comment" column="COMMENT" type="string" length="255" />
    		<property name="paymentReference" column="PAYMENT_REFERENCE" type="string"/>
    		<many-to-one name="cardProcessorTransaction" column="CARD_PROCESSOR_TRANSACTION_ID" class="com.scn.payment.services.data.CardProcessorTransaction"/>
    		<many-to-one name="parentCustomerPayment" column="REFUND_CUSTOMER_PAYMENT_ID" class="com.scn.payment.data.CustomerPayment" lazy="proxy"/>
    		<!-- links to customer -->
    		<many-to-one name="customer" column="CUSTOMER_ID" class="com.scn.core.data.Customer" cascade="none"/>
    		<!-- links to lookup tables -->
    		<many-to-one name="currency" column="CURRENCY_CODE" class="com.scn.payment.data.Currency" cascade="none"/>
    		<many-to-one name="paymentType" column="PAYMENT_TYPE_CODE" class="com.scn.payment.data.PaymentType" cascade="none" lazy="false"/>
    		<many-to-one name="paymentStatus" column="PAYMENT_STATUS_CODE" class="com.scn.payment.data.PaymentStatus" cascade="none" lazy="false"/>
    		<many-to-one name="paymentNavigation" column="PAYMENT_NAVIGATION_ID" class="com.scn.payment.data.PaymentNavigation" cascade="none"/>
    		<!-- links to user -->
    		<many-to-one name="createdByUser" column="CREATED_BY_USER_ID" class="com.scn.core.data.User" cascade="none"/>
    		<!-- link to purchase items -->
    		<set name="purchaseItems" cascade="save-update">
    			<key column="CUSTOMER_PAYMENT_ID"/>
    			<one-to-many class="com.scn.payment.data.PurchaseItem"/>
    		</set>
    		<!-- link to payment flags -->
    		<set name="paymentFlags" table="CUSTOMER_PAYMENT_FLAG" lazy="false" cascade="persist">
    			<key column="CUSTOMER_PAYMENT_ID"/>
    			<many-to-many column="PAYMENT_FLAG_ID" class="com.scn.payment.data.PaymentFlag"/>
    		</set>
    	</class>
    Merci pour ton aide.

    Eco.

  4. #4
    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
    Que représente CUSTOMER_PAYMENT_FLAG ?
    Quelle est sa structure ?
    Tu n'as pas un graphe type MCD par hasard ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Eco
    Eco est déconnecté
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 32
    Par défaut
    Bonjour OButterlin,

    CUSTOMER_PAYMENT_FLAG represente un set de flags au travers desquels mes payments peuvent passer.

    La struture de la table est la suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE  `customer_payment_flag` (
      `CUSTOMER_PAYMENT_FLAG_ID` bigint(20) NOT NULL auto_increment,
      `CUSTOMER_PAYMENT_ID` bigint(20) NOT NULL,
      `PAYMENT_FLAG_ID` int(11) NOT NULL,
      PRIMARY KEY  (`CUSTOMER_PAYMENT_FLAG_ID`),
      KEY `CUSTOMER_PAYMENT_ID` (`CUSTOMER_PAYMENT_ID`),
      KEY `PAYMENT_FLAG_ID` (`PAYMENT_FLAG_ID`)
    );
    Pour ce qui est de PAYMENT_FLAG, cette table contient tous les FLAG possible. Elle contient 4 entrees (Transaction queried by Manager, Customer updated, Transaction breaches internal limits et Rejected by review).

    Voici sa structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE  `payment_flag` (
      `PAYMENT_FLAG_ID` int(11) NOT NULL,
      `PAYMENT_FLAG_NAME` varchar(50) default NULL,
      PRIMARY KEY  (`PAYMENT_FLAG_ID`)
    );
    Je n'ai pas de MCD mais je peux en generer 1 si tu en as vraiment besoin mais je ne pense pas que ma question soit specifique a mon implementation.

    Je me demande juste comment faire une jointure entre ma requete et ma sous requete (en utilisant criteria).
    Lorsque j'imprime la requete SQL genere par mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DetachedCriteria contents = DetachedCriteria.forClass(PaymentFlag.class, "pf").add(Expression.eq("id", 7));
     
    criteria.createCriteria("payments").add(Expression.eq("paymentStatus", 1)).add(Expression.not(Subqueries.exists(contents.setProjection(Projections.property("pf.id")))));
    J'obtiens quelquechose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from CUSTOMER_PAYMENT cp where cp.payment_status_code=7
    and not exists (select * from CUSTOMER_PAYMENT_FLAG cpf where
    payment_flag_id=1)
    Je me demande juste comment ajouter cette condition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cpf.customer_payment_id=cp.customer_payment_id
    Eco.

  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
    Je ne pense pas qu'il soit judicieux (voir possible) de faire ça par Criteria.
    Je te conseille d'utiliser directement le query natif (createSQLQuery).

    Maintenant, sur le fond, je suppose que tu fais cette requête préalable pour voir si tu n'as pas déjà ce statut d'affecté pour un paiement de ce client.
    Si c'est le cas, tu peux très bien t'en passer puisque tu as mappé dans ton objet CustomerPayment la liste des flags. Il te suffit de parcourir le Set pour voir si le statut n'est pas présent...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. probleme avec sous requete
    Par erox44 dans le forum VBA Access
    Réponses: 1
    Dernier message: 20/12/2007, 14h54
  2. Probleme de sous requete
    Par pooi1 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 13/07/2007, 14h18
  3. [Requête] Calcul extrêmement lent : problème de sous-requêtes ?
    Par laurentcr dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 02/10/2006, 12h34
  4. Probleme de sous requete DEBUTANT
    Par nashouille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/09/2005, 11h47
  5. probleme de sous requete
    Par JD_Lyon dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 09/04/2004, 22h18

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