2010-01-14 6 views
20

Je suis un débutant à Hibernate.Hibernate et fin inattendue de l'exception Subtree

J'ai un POJO Item qui contient un Set<String> composé d'étiquettes. Les étiquettes sont contenues dans une autre table de base de données de la table Item, donc je fais une jointure pour peupler le pojo.

J'essaie d'exécuter un exemple de requête simple à partir du livre "Java Persistance with Hibernate" où j'interroge from Item item where 'hello' member of item.labels. Seulement, pour une raison quelconque, je reçois un

`org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree[from /*qualified class path*/.Item item where 'hello' member of item.labels]` 

Ce qui pourrait être à l'origine de ce problème?

Voici mes POJO:

public class Item 
     private int uuid; 
     private Set<String>labels = new HashSet<String>(); 

     @Id 
     public int getUuid(){ 
      return uuid; 
     } 

     @CollectionOfElements 
     @JoinTable(name="labels", [email protected](name="uuid")) 
     @Column(name="label") 
     public Set<String> getLabels(){ 
      return labels; 
     } 
} 

Répondre

7

Pour les primitives collections vous devez utiliser requête HQL comme ceci:

from Item item join item.labels lbls where 'hello' in (lbls) 

PS: 'join' est requis car 'labels' est une variante OneToMany ou ManyToMany, les parenthèses sont obligatoires car 'lbls' est une collection

47

De googler autour, il semble que votre collection de paramètres peut être vide. J'ajouterais une vérification vide avant d'appeler la requête.

La leçon est que Google est votre ami. Lorsque vous ne parvenez pas à trouver un message d'erreur, essayez de le saisir dans Google (ou dans votre moteur préféré). Il est peu probable que vous soyez la première personne à avoir été déroutée.

+1

Cependant, la requête "à partir de l'élément Item" renvoie exactement correct, avec des collections non vides. En outre, la requête "à partir de Item item où taille (item.labels)> 0" renvoie correctement, donc je ne pense pas que c'est un problème de taille –

+1

Merci - c'était exactement le problème que j'avais. Quel message d'erreur stupide! –

+0

... et si la collection n'a qu'un seul élément, vous obtenez un message de journal comme 'ERROR [main] o.h.h.PARSER // - : 0: 0: fin inattendue de sous-arbre'. J'aime l'aide de ce diagnostic. – alf

1

Le membre de la commande dans HQL est réservé à l'utilisation d'objets non primitifs. Il y a deux choses que tu peux faire. Vous pouvez créer un SQLQuery comme suit:

SQLQuery sQuery = session.createSQLQuery("select * 
              from item_table it 
              inner join label_table lt 
              where it.id = lt.item_id 
              and lt.label = 'hello'"); 
sQuery.list(); 

Ou vous pouvez créer une classe appelée Label et procédez comme suit dans votre HQL:

from Item item, Label label 
where label member of item.labels 
     and label.label = 'hello' 

Hope this helps :)

+0

aww man, j'espérais que cela ne viendrait pas à SQL;) Merci, cependant, votre solution a bien fonctionné! –

+0

Pas de problème, Scott. :) – jtbradle

1

Basé sur les commentaires sur le bug HHH-5209, qui est à peu près la même exception lancée depuis une même requête JPQL, je crois que la forme correcte est ici:

select item from Item item where 'hello' in elements(item.labels) 

la fonction elements il est la clé. C'est peut-être un peu plus simple que la suggestion de Yuri, car cela évite la jointure explicite.

Questions connexes