8
votes

Critères hibernate requête pour la table de collecte?

J'ai une entité suivante xxx pré>

suivante est mon action p> xxx pré>

Je veux aller chercher une liste de règles ayant un ensemble particulier d'actions J'essaie cette p> xxx pré>

mais obtenir org.hibernate.mbappeException: la collecte n'était pas une association: exception .. p>

edit strong> em> em> Ainsi, après des conseils de Jbrocover, j'ai essayé d'aller chercher une classe d'emballage pour une action nommée de règle et a été capable d'eshtabler la relation OneTomanany, j'ai également modifié la requête comme suit P>

    Set<Action> act = new HashSet<Action>();
    act.add(Action.EMAIL);
    act.add(Action.POSTAL);

    DetachedCriteria criteria = DetachedCriteria.forClass(Rule.class);
    criteria.add(Restrictions.eq(SUPPORT_LANG, Language.valueOf("EN")))
            .createCriteria("ruleActions").add(Restrictions.in("action",act));
    return getHibernateTemplate().findByCriteria(criteria);


0 commentaires

3 Réponses :


1
votes

La requête critère a l'air bien. Supposons que nous ayons des tables: xxx

La cartographie doit être la suivante: xxx

de cette façon, votre requête de critère devrait fonctionner.


4 commentaires

Salut pouvez-vous s'il vous plaît laissez-moi savoir comment écrire une requête de critère hibernate pour la case ci-dessus, je souhaite ajouter des critères de manière à renvoyer toutes les règles ayant une action A et D (en dehors des actions {A, B, C , D, e})


Bonjour, je suis désolé, apparemment je suis mauvais pour lire attentivement les questions. La réponse initiale était totalement trompeuse, alors je l'ai complètement réécrit. Regarde.


En fait, je suis un peu préoccupé par la modification du mappage car le code actuel utilise la collecte de la collection. Et le mappage actuel est largement utilisé, je veux donc simplement être sûr que je ne casse pas que le code existant .. modifie-t-il la cartographie comme celle que vous avez racontée affectera le système existant?


De plus, je suis désolé de ne pas avoir mentionné que mon action est de type Enum .. J'ai mis à jour la question avec l'entité d'action. Et ont commencé une générosité de 50 points.



6
votes

Désolé, ce que vous essayez de faire, spécifiquement, n'est pas pris en charge dans Hibernate. Voir cette FAQ:

http://community.jboss.org/wiki/HibernateFAQ- AdvancedProblèmes # im_getting_orghibernatemappingException_Collection_was_not_an_association_when_a_try_to_join_a_recteur_to_join_a_collection_of_components_with_criteria_queries

i, aussi, était assez mécontent de cela. Comme vous pouvez le constater, cependant, ils ont essayé de le réparer d'avoir été incapables de le faire et d'avoir placé la communauté à y faire face. Vous avez quelques options:

  1. Utilisez HQL pour exécuter la requête.
  2. ré-écrire votre association de collection en tant que classe d'entité réelle avec un seul champ Enum.

    vous pouvez faire quelque chose comme ceci: xxx

    puis, mettez à jour vos associations et interrogez en conséquence afin que règle a une Code> Set . Il y a d'autres travaux de contournement, mais vous ne pouvez essentiellement pas utiliser critères et @ElementCollection ensemble.

    Mise à jour < P> Afin de restreindre la requête en outre, de vous assurer que vous obtenez des règles qui répondent à la fois aux deux actions, vous devez exécuter la sous-requête et faire une conjonction - 'et' - des valeurs correspondantes. Quelque chose comme ça devrait fonctionner: xxx

    à la fin, vous pouvez trouver des résultats en double. Ceci est courant et peut être éliminé en ajoutant ceci: xxx

    Je ne peux pas parler de l'efficacité de ce code - HQL peut être mieux à long terme. Cependant, j'ai fait quelque chose de similaire dans d'autres projets et j'ai rencontré des problèmes.


3 commentaires

Salut Jbrookover ..Merci !! Selon votre suggestion, j'essaie de procéder à la classe wrapper. et ont modifié votre réponse selon ce que je fais ..so que cela pourrait aider les autres personnes à faire face à un même problème


@Anupamgupta a mis à jour pour inclure la requête restreinte.


merci @jbrocover à partir de maintenant j'ai utilisé HQL.. et bien occupé à utiliser votre solution le changera bientôt selon votre suggestion et mettra également à jour ici, afin que cela puisse être utile pour les autres



3
votes

Une autre solution sans envelopper votre énumérum et utiliser résultatsTtransformers est-ce: xxx

requête: xxx

c'est ce qui a fonctionné pour moi avec hibernate 4.1.6.final. J'ai trouvé ça ici .


0 commentaires