显然,休眠模板查询将字符串参数“ tableName”注入带引号的查询中.这将导致SQL语法语法错误.
如何将表名添加为查询参数之一?
例如,由于表名,以下代码将不起作用:
SQLQuery query = session.createSQLQuery("SELECT ID FROM :tableName");
query.setFlushMode(FlushMode.MANUAL);
query.setReadOnly(true);
query.setParameter("tableName", "STUDENT");
List<Object[]> list = query.list();
解决方法:
表名称不能在查询中参数化.
您实际上想要实现的是构建一个将用于构造查询的字符串:
SQLQuery query = session.createSQLQuery(getIdsQuery("STUDENT"));
...
private String getIdsQuery(String tableName) {
return "SELECT ID FROM " + tableName;
}
缺乏对表名进行参数化的能力与Hibernate无关-数据库不支持它.支持它是没有意义的.
绑定变量主要是出于性能原因而存在.关键是,您将使用占位符将变量发送到数据库的查询(通过jdbc驱动程序),该变量将在同一查询的两次调用之间发生变化:
select id from STUDENT where name = ?
数据库将解析该查询,为其计算成本,制定执行计划并对其进行缓存.查询的后续调用将更快,因为将跳过所有这些步骤并使用cached execution plan.
如果表名未知(已参数化),数据库如何缓存语句和执行计划?如果不知道从何处获取数据,它将不知道获取数据的成本和最佳路径.
此外,如果数据库不知道被查询的列是否确实存在于表中,则在解析该查询时将无法完全验证该查询(如果对表名进行了参数设置,则在语句解析时将是未知的).
标签:hibernate,spring,sql,java 来源: https://codeday.me/bug/20191120/2041194.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。