把项目部署linux上报错:; SQL []; 执行未准备SQL语句; nested exception is java.sql.
xml的sql是:
SELECT <include refid="Base_Column_List" />
FROM ORGANIZATION where ORG_CODE
in
<foreach collection="orgCodes" index="index" item="id" open="(" separator="," close=")">
${id}
</foreach>
集合orgCodes的数据为[-1, 01, 0101, 0102]
后台输出的SQL是:
SELECT
ORG_ID ,
ORG_CODE ,
ORG_NAME ,
PARENT_CODE,
FROM
ORGANIZATION
where
ORG_CODE in
( com.aestit:aestit-sso-server-gch:war:1.1.1,
com.aestit:aestit-sso-server-gch:war:1.1.1,
com.aestit:aestit-sso-server-gch:war:1.1.1,
com.aestit:aestit-sso-server-gch:war:1.1.1
)
后来查资料说:orgCodes
集合中的元素被误解释为Maven的GAV(GroupId, ArtifactId, Version)格式,
解决方式:把 ${id} 改成 #{id}
补充 :
${} 和 #{} 去区别
${}
:这是一个参数占位符,用于在 SQL 查询中引用变量或参数。${}
允许在查询中直接插入变量值,并且变量值会被直接替换到查询中。这意味着在执行查询之前,变量值会被解析并插入到查询字符串中。
#{}
:这是一个预处理器指令,用于在 SQL 查询中引用变量或参数。与 ${}
不同,#{}
会在查询执行之前被预处理器处理,而不是在查询执行时。这意味着变量值在查询执行之前就已经被解析和替换。
区别:
${}
是直接在查询执行时替换变量值,而#{}
是在查询执行之前进行替换。${}
的替换是简单的字符串替换,容易受到 SQL 注入攻击,因此在使用时需要格外小心。#{}
由于在预处理器中进行处理,相对更安全一些。- 在性能方面,
${}
的替换方式可能会更快一些,因为它只在查询执行时进行替换,而#{}
需要在预处理器中进行处理。但在大多数情况下,这个性能差异是可以忽略不计的。
总之,${}
和 #{}
在 SQL 中用于引用变量或参数,但它们在处理和安全性方面有所不同。通常情况下,建议使用 #{}
来引用变量或参数,因为它更安全且不易受到 SQL 注入攻击。