hibernate中的createSQLQuery使用Prepared Statement?

时间:2014-08-01 06:29:56

标签: java sql sql-server hibernate

我在Hibernate中使用createSQLQuery setString(无硬编码值)。我想知道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中也是如此,所以请提供链接(如果有的话)。

2 个答案:

答案 0 :(得分:9)

我尝试使用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)

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

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

答案 1 :(得分:1)

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