Java 在具有IN关键字的子集合内进行HQL搜索
当应用于某个对象集合中的搜索时,我真的无法在关键字中找到足够的关于hibernate的文档。我有一个奇怪的问题,我有一个hql查询:Java 在具有IN关键字的子集合内进行HQL搜索,java,hibernate,hql,Java,Hibernate,Hql,当应用于某个对象集合中的搜索时,我真的无法在关键字中找到足够的关于hibernate的文档。我有一个奇怪的问题,我有一个hql查询: FROM Contact co, IN (co.categories)categories WHERE categories.name = ? 当然,我期待着一份联系人名单。但它有点问题,因为它不是返回联系人对象列表,而是返回对象[]?????这是语法还是完全错误 以下是映射部分: <set lazy="false" name="cate
FROM Contact co, IN (co.categories)categories WHERE categories.name = ?
当然,我期待着一份联系人名单。但它有点问题,因为它不是返回联系人对象列表,而是返回对象[]?????这是语法还是完全错误
以下是映射部分:
<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>
需要注意的重要事项:此查询是使用查询生成器进行的。这是其中一个生成的查询的打印输出,该查询失败。非常奇怪的是,我在这个列表中得到了正确数量的对象,我用给定的参数检查了数据库,数量是正确的,但是我没有得到联系人对象,而是列表中的一些对象数组
感谢所有帮助您需要添加
选择co
因此,您的查询是从联系人co中选择co,在(co.categories)categories中,categories.name=?
SELECT co
是必需的,它告诉Hibernate每个结果集行应该返回哪一项
从Contact co LEFT JOIN co.categories cat中选择co,其中cat.name=?
到目前为止,我只在Where-子句中看到了IN
关键字。像这样的东西
来自catagories cat WHERE cat.name IN('HALLO','WORLD')
我不喜欢回答我的问题,虽然我不太明白为什么这个选择是必要的,但这是一种魅力。如果有人解释我的理由,我会很乐意投他的票
**SELECT co** FROM Contact co, IN (co.categories)categories WHERE categories.name = ?
谢谢大家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);
}
List results=//获取查询的代码;
//只是第一个,或者您可以使用外部循环打印每个条目
Object[]firstObject=results.get(0);
for(对象o:firstObject){
System.out.println(o.getClass()+“-”+o);
}
我的猜测是hibernate正在推断联系人对象和单独的类别列表,或者正在将查询返回的列作为基本包装器。无论如何,问题似乎是Hibernate无法从DBMS返回的列列表中找出您希望获取的内容。在第二个查询中,您将其缩小为所需特定类型的别名,因此一切都按预期进行 这在Grails2.1.4 HQL中对我很有效 Task.executeQuery(“ 从task join task.tags标记中选择任务,其中tag.name='duplicate') 假设实体Task.groovy
static hasMany = [tags: Tag]
请你描述一下你的域类和你想做什么,因为我相信你的尝试是错误的。请检查高级的答案,好的,我可能缺少关键字。将尝试now@Julia-我已经添加了
SELECT co
的内容,也许将其添加到您的原始查询中就足够了-但这只是猜测。我没有接受您的答案,因为不是上面的答案是正确的,而是您在评论中写的东西。非常重要的是,可以使用IN关键字而不是join。如果你编辑你的答案(为未来的人)并给出一些理由,我很乐意投票:)