我真的找不到关于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对象,但列表中的一些对象数组。
感谢所有帮助
答案 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]