我在Hibernate中使用带有setString(无硬编码值)的createsqlQuery.我想知道Hibernate是否将createaredStatement用于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");
解决方法
我试图使用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.