【问题标题】:Getting the object with the highest member value in hql?获取hql中成员值最高的对象?
【发布时间】:2010-05-24 19:24:37
【问题描述】:

我对 hql 还是有点陌生​​,我对正在编写的查询的聚合函数和效率有疑问。

假设我在 hibernate 中映射了这个类(为简洁起见,省略了 getters/setters/constructors/etc):

public class Foo
{
    private int i;

    private String s;

    private float f;
}

我想做一个 hql 查询以获取具有最高 i 值和指定 s & f 值的 Foo 实例。我目前的解决方案是这样的:

List<Foo> fooList = (List<Foo>)session.createQuery(
    "from Foo as foo where foo.s = :str and foo.f = :val order by foo.i desc").
    setParameter("str", <stringgoeshere>).setParameter("val", <floatgoeshere>).
    list();
return fooList.get(0);

如果我理解正确,此方法将具有N+1 selects problem(尽管只要我仅从列表中获取第一个结果,N 就有望为 1,但仍然如此)。我假设有一些方法可以使用 uniqueResult() 执行此操作,但我不太了解聚合函数在这种情况下如何工作。我能找到的关于“max()”的唯一示例要么在 where 子句中,要么在返回值中。

我应该如何编写此查询以在单次选择中完成并获取 i 最高的 Foo 实例?

感谢您的帮助!

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    如果我理解正确的话,这个方法会有N+1个选择问题

    我看不出您的查询如何导致 n+1 次选择。 Hibernate 没有理由迭代第一个查询的结果并在此处执行后续查询。

    我假设有一些方法可以使用 uniqueResult() 执行此操作,但我不太明白聚合函数在这种情况下如何工作。

    如果你想检索单个结果,检索整个表格确实很聪明。首先,查询会更有效,其次,您不会白白浪费内存(甚至可能使 Session 爆炸)。如果您的表包含一百万条记录怎么办?

    我应该如何编写此查询以在单次选择中完成并获取 i 最高的 Foo 实例?

    如前所述,只检索想要的记录,使用setMaxResults(1) 限制结果数量(这将根据您的数据库生成正确的 SQL 顺序):

    Foo foo = (Foo) session.createQuery(
        "from Foo as foo where foo.s = :str and foo.f = :val order by foo.i desc")
        .setParameter("str", <stringgoeshere>).setParameter("val", <floatgoeshere>)
        .setMaxResults(1)
        .uniqueResult();
    return foo;
    

    【讨论】:

    • 嗯,所以即使你使用 uniqueResult 你仍然需要将 max results 设置为 1 否则它会拉出所有记录?很高兴知道,我认为自动执行此操作足够聪明。
    • 刚刚注意到你在上面评论了它:)
    • 我认为我的代码最终会执行 2 次选择:一个用于 .list(),另一个用于 .get(0)。不是这样吗?
    • @serg555 uniqueResult 不是关于限制查询中的结果数量,而是关于从结果集中检索 0 或 1 个实体(如果有更多则抛出异常)。但是你现在已经注意到了:)
    • @Seth: No. list() 执行选择并检索结果为Listget(0) 为您提供List 的第一个元素。我建议激活 SQL 日志记录,以便您可以看到 Hibernate 正在做什么。
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多