【问题标题】:Different results fetching results with query api vs. hql使用查询 api 与 hql 获取结果的不同结果
【发布时间】:2011-04-27 11:20:17
【问题描述】:

我有以下实体(不准确,但给出了一个大致的想法):

@实体 公共类 WebElement 实现可序列化 { 私有静态最终长序列版本UID = 1L; @ID @GeneratedValue 私人长ID; @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }) 私有集 核心元素; 私有字符串代理; // ... 省略 const' get/set hashcode equals 等。 } 公共类CoreElement实现可序列化{ 私有静态最终长序列版本UID = 1L; @ID @GeneratedValue 私人长ID; 私有字符串值; // ... 省略 const' get/set hashcode equals 等。 }

我的问题是在尝试使用 Criteria API 与 HQL 获取 WebElements
执行以下操作时,我得到一个空列表。

getCurrentSession().createCriteria(WebElement.class)
                        .createCriteria("coreElements").add(
                                        Restrictions.eq("value", value)).list();

但是在执行以下 HQL 时,我得到了正确的结果。

选择不同于WebElement的we,in(we.coreElements) core
                                  其中 core.value = :inputValue

您能否帮助找出我在这些调用之间做错了什么或不同之处?
注意我更喜欢使用 Criteria API 而不是 HQL。

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    您使用的是 Restrictions.eq 而不是 Restrictions.in()..因为您使用的是 HQL。

    【讨论】:

    • in() 方法是 HQL 内连接的缩写。两个调用都产生(几乎)相同的 SQL。我将 Criteria API 更改为使用“in”,但得到了相同的无结果结果。
    【解决方案2】:

    在您的 HQL 中,您正在创建一个内部连接,这会导致 Hibernate 获取元素。

    在条件查询中,您可以通过 FetchMode.JOIN 使用 setFetchMode()

    由于您的查询是静态的,我建议使用 HQL - 它更容易理解。

    【讨论】:

    • 也试过了,获取模式并没有改变结果。我把它留给了 HQL,但这个问题仍然困扰着我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多