Hibernate和意外的Subtree异常结束

时间:2010-01-14 18:07:50

标签: java hibernate hql

我是Hibernate的新手。

我有一个Item POJO,其中包含由标签组成的Set<String>。标签包含在Item表的另一个数据库表中,因此我进行了连接以填充pojo。

我正在尝试从“Java Persistance with Hibernate”一书中运行一个简单的示例查询,我在其中查询from Item item where 'hello' member of item.labels。只是,出于某种原因,我得到了一个

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

可能导致此问题的原因是什么?

以下是我的POJO:

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

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

       @CollectionOfElements
       @JoinTable(name="labels", joinColumns=@JoinColumn(name="uuid"))
       @Column(name="label")
       public Set<String> getLabels(){
            return labels;
       }
 }

4 个答案:

答案 0 :(得分:48)

从谷歌搜索,您的参数集合似乎是空的。我在调用查询之前添加一个空的检查。

教训是Google是你的朋友。如果您无法找出错误消息,请尝试将其输入Google(或您最喜欢的引擎)。您不太可能成为第一个被它迷惑的人。

答案 1 :(得分:7)

对于基元集合,您应该使用如下的HQL查询:

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

PS:'join'是必需的,因为'标签'是OneToMany或ManyToMany变体,括号是必需的,因为'lbls'是一个集合

答案 2 :(得分:1)

HQL中的命令成员保留用于非基本对象。你可以做两件事。您可以按如下方式创建SQLQuery

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();

或者您可以创建一个名为Label的类,并在HQL中执行以下操作:

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

希望这会有所帮助:)

答案 3 :(得分:1)

基于对错误HHH-5209的评论,这是关于从类似的JPQL查询抛出的相同异常,我相信这里的正确形式是:

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

elements功能有关键。这可能比Yuri的建议稍微简单一些,因为它避免了显式连接。