2009-10-28 8 views
1

Dans le fichier de mappage d'hibernation, j'utilise la formule de propriété pour obtenir n'importe quelle valeur.Formule de propriété hibernate comment obtenir plus de 1 rangée?

<property name="price" type="double" formula="(select SUM(amount) ...) /> 

Mais cela permet d'obtenir seulement 1 rangée. Comment puis-je obtenir lisf de lignes? Je comprends que "propriété" ne convient pas, mais il est impossible d'ajouter une formule à définir ou à lister.

Bien sûr, je veux juste obtenir des valeurs sans ajouter de nouvelles classes. J'ai juste la requête sql et je m'attends à avoir une liste ou un ensemble pour une classe existante.

+0

Semble que vous voulez vraiment avoir une référence 1: m, sans un champ de référence «approprié». Est-ce correct? –

+0

Eh bien, je dois ajouter une liste à ma classe. Il utilisera SEULEMENT pour montrer toute information supplémentaire concernant cet objet. Et ces tables ne sont pas couvertes par le fichier de mappage, car elles sont utilisées par une autre application. –

Répondre

1

Les propriétés de formule ne fonctionnent que sur la ligne en cours. Si vous souhaitez effectuer des fonctions d'agrégation, vous devez écrire une requête spécifique pour les récupérer. Voir le section of the hibernate docs that handle aggregate functions.

+0

Oui, je peux écrire une requête qui retourne plus de 1 ligne, mais comment puis-je stocker ce résultat dans ma classe? Et je veux définir cette requête dans mon fichier XML de mappage lié à ma classe. –

+0

Vous ne pouvez pas, c'est ce que je dis. Vous ne pouvez pas avoir une propriété d'une ligne qui contient des données de plusieurs lignes, cela n'a pas de sens. – skaffman

+1

Je ne dis pas que je veux exactement la propriété. Que ce soit liste ou ensemble ou quelque chose d'autre, n'a pas d'importance, mais comment? –

0

Les formules s'appliquent uniquement aux propriétés à valeur unique; pas aux collections. Vous pouvez toutefois spécifier un custom SQL statement to be used for loading a collection. La partie difficile ici est que de votre question, il semble que ce que vous voulez est une collection d'éléments (prix double) plutôt que des entités; Je n'ai jamais essayé de spécifier le chargeur personnalisé pour quelque chose comme ça et donc je ne sais pas si cela va fonctionner. La documentation est plutôt silencieuse sur cette question.

Si ce qui précède ne fonctionne pas, une autre option consiste à définir votre SELECT comme une collection de vue et de carte de cette façon (à nouveau, comme collection d'éléments).

Enfin, vous pouvez également exécuter une requête comme skaffman suggérée. Vous devrez invoquer cette requête et remplir manuellement une collection sur votre entité, le cas échéant (par exemple, dans votre DAO après le chargement de l'entité). Vous pouvez define an appropriate listener et le faire à cet endroit.

+0

lien mort ...exemple de code aurait été plus utile – Gus

+0

Yup, liens morts sont très boiteux. – Casey

1

Si votre formule renvoie plus d'une ligne, vous devez lier la déclaration avec l'identifiant de l'entité, par exemple:

sélectionnez le nom de la colonne
de TableTable .identifier = entity_identifier

En ce qui concerne l'application à un ensemble de valeurs, peut-être qu'un groupe par fonction peut s'appliquer. J'ai utilisé une fois group_concat de mysql par exemple pour montrer une liste de valeurs. La mauvaise chose est que la formule était couplée au dialecte natif de mysql, mais cela a fonctionné.

+0

Nice d'avoir des connaissances sur la fonction group_concat. Merci d'avoir posté la suggestion. –

Questions connexes