【问题标题】:createSQLQuery in hibernate uses Prepared Statement?hibernate中的createSQLQuery使用Prepared Statement?
【发布时间】:2014-09-24 07:11:00
【问题描述】:

我在 Hibernate 中使用 createSQLQuerysetString(无硬编码值)。我想知道 Hibernate 是使用 PreparedStatement 代替 createSQLQuery 吗?

关注:

我想将此查询创建的执行计划保存在缓存中,以便下次在数据库上触发相同的查询时,它将使用相同的执行计划。

仅供参考:我使用的是 MSSQL Server 2008

/* This is just example I'm not using same query */
Query nativeSQLQuery = session.createSQLQuery("select Firstname from user_master where user_name = :param");
nativeSQLQuery.setString("param", "vicky.thakor");

我找不到 stackoverflow 链接,甚至在 google 中都找不到,因此请提供链接(如果有)。

【问题讨论】:

  • 每次想要执行查询时都使用 nativeSQLQuery。执行前设置参数即可。
  • @Darshan Lila 让你的回答有些道理。你的答案没有任何意义......

标签: java sql sql-server hibernate


【解决方案1】:

我尝试使用 Hibernates 的 createSQLQuery 方法执行查询,然后它会给我如下异常:-

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)

从上面的异常我们可以看出,它会尝试在内部执行com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)

我还发现了@Alex Serna 在Hibernate createSQLQuery parameter substitution 提出的问题,其中 Alex 在尝试替换表名时也遇到了异常。

我认为观察堆栈跟踪 Hibernate 在内部使用 PreparedStatement 进行 createSQLQuery

【讨论】:

  • 这是回答问题的一种奇怪方式,但我喜欢这种方式......我找到了另一种证明 hibernate 使用 PreparedStatement 的方式。还是谢谢。
  • 在 SQL Server 中执行 DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS GO,然后在休眠中执行任何 select 查询,然后在 SQL Server 中执行 SELECT usecounts, size_in_bytes, cacheobjtype, text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle) WHERE cacheobjtype != 'Parse Tree'
【解决方案2】:

Hibernate SQLQuery 绕过 Hibernate Session 缓存并仅针对数据库进行查询。你可以阅读更多@Hibernate: SQL vs HQL with the Session Cache

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多