【问题标题】:Performance difference in various Hibernate Queries on VarChar MsSql columnsVarChar MsSql 列上各种 Hibernate 查询的性能差异
【发布时间】:2011-09-26 13:20:19
【问题描述】:

我在休眠中有一个查询,我认为这是因为驱动程序和 MsSql 中的 VARCHAR 和 NVARCHAR 存在差异,这里讨论了 Getting Hibernate and SQL Server to play nice with VARCHAR and NVARCHAR。我知道这个问题与 Hibernate 无关,但我对 hibernate 处理下面代码的方式感到困惑。

当我们运行下面的查询时(使用 set 参数并且不使用它),在具有 VARCHAR 列类型的数据库上,列 'code' ,我们发现在 HQL 中附加字符串比 setParameter(或 Criteria Query 哪个应该比 HQL 快)。

Query createQuery = session.createQuery("from abc where code='"+substring+"'");
/*Query createQuery = session.createQuery("from abc where   code=:substring");
                createQuery.setParameter("substring","Test");*/
                return createQuery.list();

请告诉我这将如何产生影响。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    数据库计算的执行计划可能在两个查询之间不同。 this question 中描述了类似的问题,我的 DBA 已经告诉我,Oracle 也可能出现同样的问题。

    【讨论】:

    • 但是为什么我的 Criteria Query 比较慢? .我很困惑,因为设置 sendStringParametersAsUnicode=false 给了我与附加参数的查询相似的性能。 HQL 中的 setParameter 似乎提供与 Criteria 相同的性能。那么,将参数直接附加到查询是否有助于克服数据库中的 VARCHAR 问题?
    • 当您在 HQL 查询中没有任何参数时(即,当您使用字符串连接并且不必在查询上调用 setParameter 时),JDBC 驱动程序没有任何参数发送。在这种情况下,sendStringParametersAsUnicode 无关紧要。当您有一个参数化的 HQL 查询时,或者当您使用 Criteria API 时,Hibernate 会生成准备好的语句并且 JDBC 驱动程序会发送参数。在这种情况下,sendStringParametersAsUnicode 是相关的。
    • @Nizet:现在我明白了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2011-02-02
    • 2012-07-15
    • 2010-12-26
    相关资源
    最近更新 更多