使用IN关键字在子SET中进行HQL搜索

时间:2011-05-03 18:47:58

标签: java hibernate hql

我真的找不到关于hibernate IN关键字的足够文档,当在一些对象的集合中应用于搜索时。我有奇怪的问题,我有一个hql查询:

    FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

在我期待的联系人列表中。但它有问题,因为它没有返回Contact对象的列表,而是Object []的列表?????是语法还是完全错误?

以下是映射部分:

     <set lazy="false" name="categories" table="ContactCategory">
        <key column="id" foreign-key="fk_contact_category" />
        <many-to-many class="Category" column="catid"
            foreign-key="fk_contact_category2" />
    </set>

     <class name="Category">

    <id column="catid" name="Id" type="long">
        <generator class="sequence" />
    </id>
    <property length="50" name="name" type="string" />  
</class>

重要的是要提到:此查询是使用查询构建器进行的。这是其中一个生成的查询失败的打印输出。非常奇怪的是 - 我在这个列表中得到正确数量的对象,我检查数据库和数字是否正确与给定的参数,但我没有得到Contact对象,但列表中的一些对象数组。

感谢所有帮助

4 个答案:

答案 0 :(得分:4)

您需要添加SELECT co

以便您的查询为SELECT co FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

SELECT co是必要的,告诉Hibernate每个结果集行应返回哪一项。


SELECT co FROM Contact co LEFT JOIN co.categories cat WHERE cat.name = ? 到目前为止,我只在Where - 子句中看到了IN关键字。像这样的东西,

FROM catagories cat WHERE cat.name IN ('HALLO', 'WORLD')

答案 1 :(得分:1)

我不喜欢回答我的问题,没有真正理解为什么这个SELECT是必要的,但这是一个魅力。如果有人向我解释推理,我很乐意投票给他答案。

  **SELECT co** FROM Contact co, IN (co.categories)categories WHERE categories.name = ?

谢谢大家

答案 2 :(得分:1)

Julia,尝试在原始查询的数组中打印每个对象的类和值,如下所示:

List<Object[]> results = // code to fetch your query ;
// just the first, or you can print every entry with a outer loop
Object[] firstObject = results.get(0);
for (Object o : firstObject) {
  System.out.println(o.getClass() + " - " + o);
}

我的猜测是,hibernate推断Contact对象和单独的Category列表,或者将查询返回的列作为原始包装器。无论如何,问题似乎是Hibernate无法弄清楚你期望从DBMS返回的列列表中获取什么。在第二个查询中,您将其缩小为您想要的特定类型的别名,因此一切都按预期工作。

答案 3 :(得分:0)

这在Grails 2.1.4 HQL中对我有用

Task.executeQuery(&#34; 从任务任务加入task.tags标签中选择任务,其中tag.name =&#39;复制&#39; &#34)

假设实体Task.groovy有

static hasMany = [tags: Tag]