проблема с реализацией SqlStatementParser по умолчанию в hibernate, которая используется в многострочном экстракторе команд sql.
если вы посмотрите на определение грамматики hibernate-core/src/main/antlr/sql-stmt.g
, есть определение оператора End:
STMT_END
: ';' ( '\t' | ' ' | '\r' | '\n' )*
;
NOT_STMT_END
: ~( ';' )
;
Это говорит о том, что конец оператора - это точка с запятой, за которой следуют символы «пробел», «табуляция», «возврат карреты» или «новая строка».
ТАМ: РЕАЛИЗАЦИЯ ПО УМОЛЧАНИЮ В HIBERNATE НЕ ПОДДЕРЖИВАЕТ КВАЛИФИКАЦИЮ ДОЛЛАРОВ.
Если вы не хотите реализовывать пользовательский парсер hibernate, вы можете переписать все функции без долларовых кавычек, используя простые '
кавычки. Но вам нужно будет тщательно избегать '
символов.
ОБНОВЛЕНИЕ: вы можете создать свой собственный ImportSqlCommandExtractor
. Например: разделите ваши команды с помощью --******
(6 звездных символов в комментарии, просто чтобы сделать ваш файл правильным файлом SQL, но с пользовательским разделением команд в комментариях, или выберите любую безумную комбинацию, которая вам нравится), а затем разделите их на простые реализация
public class ImportSqlCE implements ImportSqlCommandExtractor {
private static final Logger log = LoggerFactory.getLogger(ImportSqlCE.class);
@Override
public String[] extractCommands(Reader reader) {
try {
String allCommands = IOUtils.toString(reader);
return allCommands.split("--******");
} catch (IOException e) {
log.error("error reading import commands", e);
log.info("sengind default empty command set");
return new String[0];
}
}
}
, а затем настройте спящий режим для его использования <property name="hibernate.hbm2ddl.import_files_sql_extractor" value="example.ImportSqlCE" />
с этим ваш import.sql будет поддерживать котировки доллара (то есть он просто игнорирует любую осведомленность sql о происходящем).