【问题标题】:How does setMaxResults(N) in Hibernate work?Hibernate 中的 setMaxResults(N) 是如何工作的?
【发布时间】:2013-02-14 01:41:50
【问题描述】:

我正在使用带有 Hibernate 的 MS SQL Server 2008。我的问题是 Hibernate 如何实现setMaxResults

以下面的简单场景为例。

如果我有一个返回 100 行的查询并且如果我将 1 传递给 setMaxResults,这会影响 SQL 服务器本身返回的结果(就像运行 select top 1 语句一样)还是 Hibernate 获取所有结果首先(在这种情况下是所有 100 行)然后自己选择最上面的那一行?

我要问的原因是,当行数开始增长时,它会出现巨大的性能问题。

谢谢。

【问题讨论】:

    标签: sql-server sql-server-2008 hibernate


    【解决方案1】:

    Hibernate 将为所有支持限制查询的方言生成限制类型查询。由于 SQLServerDialect 支持这一点(请参阅 org.hibernate.dialect.SQLServerDialect.supportsLimit().getLimitString()),您将获得 select top 1 查询。

    如果您想完全确定,可以打开调试日志记录,或启用showSql-选项并进行测试。

    【讨论】:

    • 谢谢,这就是我要找的。问题是,我检查了调试输出,它确实在使用select top 1
    • 我正在使用 PostgreSQL 并且我已经打印了查询。它没有限制,在我查询完所有内容后,它似乎进入了前 50 名。你遇到过这样的事情吗?
    【解决方案2】:

    可能跟随 sn-p 会有所帮助。假设我们有一个托管 Bean 类 EmpBean,我们只需要前 5 条记录。所以下面是代码

    public List<EmpBean> getData()
    {
        Session session = null;
        try
        {
            session = HibernateUtil.getSession();
            Query qry = session.createQuery("FROM EmpBean");
            qry.setMaxResults(5);
            return qry.list();
        }
        catch(HibernateException e)
        {}
        finally
        {           
            HibernateUtil.closeSession(session);
        }
        return null;
    }
    

    这里的 getSession 和 closeSession 是静态实用方法,它们将负责创建和关闭会话

    【讨论】:

    • 感谢您的回复,但我正在寻找有关如何在幕后实施setMaxResults 的解释。从@Aleksander Blomskøld 的回复中得到了答案。
    猜你喜欢
    • 2014-10-04
    • 2017-10-25
    • 2023-04-06
    • 2012-09-13
    • 1970-01-01
    • 2013-11-14
    • 2021-02-17
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多