繁体   English   中英

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

[英]HQL search within child SET with IN keyword

当应用在一些 object 的集合中搜索时,我真的找不到关于 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>

需要提及的重要事项:此查询是使用查询生成器进行的。 这是其中一个失败的生成查询的打印输出。 非常奇怪的是 - 我在这个列表中获得了正确数量的对象,我检查了数据库,并且给定参数的数量是正确的,但是我没有得到联系人对象,但是列表中有一些 Object arrays。

感谢所有帮助

您需要添加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')

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

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

谢谢你们

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

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 object 和单独的类别列表,或者将从查询返回的列作为原始包装器。 无论如何,问题似乎是 Hibernate 无法弄清楚您期望从 DBMS 返回的列列表中获取什么。 在第二个查询中,您将其缩小为您想要的特定类型的别名,因此一切都按预期工作。

这在 Grails 2.1.4 HQL 中对我有用

Task.executeQuery(" select task from Task task join task.tags tag where tag.name = 'duplicate' ")

假设实体 Task.groovy 有

static hasMany = [tags: Tag]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM