Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在具有IN关键字的子集合内进行HQL搜索_Java_Hibernate_Hql - Fatal编程技术网

Java 在具有IN关键字的子集合内进行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

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

    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。如果你编辑你的答案(为未来的人)并给出一些理由,我很乐意投票:)