2009-10-14 6 views
0

J'ai 2 tables:Mise en veille prolongée DetachedCriteria dans la clause FROM

orders: id 
    items: id, orderId, total, flag 

Je voudrais faire la requête suivante à l'aide des critères Hibernate (DetachedCriteria):

SELECT 
     o.id, 
     SUM(i1.total), 
     SUM(i2.total) 
    FROM 
     orders o 
      LEFT JOIN 
      (
       SELECT 
        i.orderId as orderId, 
        SUM(i.total) as total 
       FROM 
        items i 
       WHERE 
        i.flag = 0 
       GROUP BY 
        orderId 
      ) AS i1 
      ON i1.orderId = o.id 
      LEFT JOIN 
      (
       SELECT 
       i.orderId as orderId, 
        SUM(i.total) as total 
       FROM 
        items i 
       WHERE 
        i.flag = 1 
       GROUP BY 
        orderId 
      ) AS i2 
      ON i2.orderId = o.id 
    GROUP BY 
     o.id 

Je sais comment utiliser DetachedCriteri un pour créer sous-requête dans la clause WHERE, mais comme vous pouvez le voir, j'ai besoin de faire une sous-requête dans la clause FROM. Si ce n'est pas possible, il est peut-être possible de l'écrire dans la clause SELECT (à l'intérieur de SUM()), car cette requête pourrait être réécrite dans un tel formulaire.

J'ai vraiment besoin d'utiliser l'API Criteria même si je dois passer un SQL natif à la requête.

Je ne vous ai pas montré les classes ou la cartographie, mais comme vous pouvez le voir, c'est un exemple très simple.

+0

Vous ne nous montre pas les classes ou la cartographie, mais l'API de critères est exprimé en termes de modèle d'objet, pas SQL. – skaffman

+0

Oui, je l'ai déjà dit. Cet exemple est si simple que je ne pense pas que les classes ou le mappage sont nécessaires ici, car mon problème ne peut peut-être pas être résolu à l'aide de l'API Criteria. – prostynick

+0

Avez-vous essayé d'utiliser des projections pour cela? L'ajout de mapping et de classes aide toujours à vérifier un conseil avant de poster. – zoidbeck

Répondre

0

J'ai trouvé une solution à mon problème. J'ai dû faire un POJO et la cartographie:

<class name="OrderTotal" 
    entity-name="OrderTotalForFlag0"> 
    <subselect> 
     SELECT 
      i.orderId AS id, 
      SUM(i.total) AS total 
     FROM 
      items i 
     WHERE 
      i.flag = 0 
     GROUP BY 
      id 
    </subselect> 
    <id name="id" type="int" /> 
    <property name="total" type="int" /> 
</class> 

Et bien sûr pour le drapeau 1, il sera similaire. Cela pourrait également être fait en déclarant des vues dans la base de données et en créant un mappage à ces vues. Dans cet exemple, j'utilisais la même classe POJO, mais un nom d'entité différent.

Puis j'ai fait une propriété dans la classe Ordre et cartographie:

<one-to-one name="orderTotalForFlag0" entity-name="OrderTotalForFlag0" /> 
<one-to-one name="orderTotalForFlag1" entity-name="OrderTotalForFlag1" /> 

paresse de cours pourrait être réglé.

Je suis sûr maintenant, que cela pourrait aussi être fait de manière différente - en faisant sous-requête dans la clause SELECT - en utilisant l'attribut formula/élément dans la cartographie des propriétés, mais cela fonctionnerait plus lent que sous-requête dans FROM clause.

Et bien sûr, tout cela était dans la documentation à Hibernate;)

Questions connexes