2014-11-20 2 views
0

Мой интерфейс-интерфейс выглядит следующим образом.Включенный фрагмент SQL не заменяет параметр

public interface CommonMapper { 
    long selectSequenceNumber(String sequenceName); 
} 

И я подготовил калькулятор sql выглядит так.

<sql id="sequenceNumber"> 
    <choose> 
    <when test="_databaseId == 'derby'"> 
     VALUES NEXT VALUE FOR #{sequenceName} 
    </when> 
    <otherwise> 
     SELECT #{sequenceName}.NEXTVAL FROM DUAL 
    </otherwise> 
    </choose> 
</sql> 
<select id="selectSequenceNumber" resultType="_long"> 
    <!--<include refid="....mapper.CommonMapper.sequenceNumber"/>--> 
    <include refid="sequenceNumber"/> 
</select> 

Когда я проверить Mapper #{sequenceName} часть не замещена дано.

14:36:09.492 [main] DEBUG ....selectSequenceNumber - ==> Preparing: VALUES NEXT VALUE FOR ? 
14:36:09.724 [main] ERROR ....PersistenceTests - failed to apply function for SqlSession 
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "?" at line 1, column 23. 
### The error may exist in .../CommonMapper.xml 
### The error may involve ....CommonMapper.selectSequenceNumber 
### The error occurred while executing a query 
### SQL: VALUES NEXT VALUE FOR ? 
### Cause: java.sql.SQLSyntaxErrorException: Syntax error: Encountered "?" at line 1, column 23. 

Это нормально? Как я могу это исправить?

ответ

2

Вы должны использовать строки подстановки ${sequenceName} вместо установки параметра с #{} для непосредственного размещения строки в запросах (например, для указания имен объектов, динамический SQL и т.д. ...)

<sql id="sequenceNumber"> 
    <choose> 
    <when test="_databaseId == 'derby'"> 
     VALUES NEXT VALUE FOR ${sequenceName} 
    </when> 
    <otherwise> 
     SELECT ${sequenceName}.NEXTVAL FROM DUAL 
    </otherwise> 
    </choose> 
</sql> 
<select id="selectSequenceNumber" resultType="_long"> 
    <!--<include refid="....mapper.CommonMapper.sequenceNumber"/>--> 
    <include refid="sequenceNumber"/> 
</select> 
+0

Могу ли я на самом деле использовать '_databaseId', кроме' 'У меня есть еще одна ошибка' Параметр '_databaseId' not found'. –

+0

Насколько я знаю, вы можете использовать '_databaseId' в любом XML, если это глобальный параметр, и если вы можете записать его в' '. – yalpertem

+1

Помните, что использование синтаксиса $ {} может сделать ваше приложение уязвимым для SQL-инъекции (если вход поступает из ненадежного источника). – doughgle

Смежные вопросы