2010-02-19 16 views
8

Je souhaite charger des fichiers de script SQL pour mes tests unitaires. Comme j'utilise Spring 2.5.2, je decided d'utiliser la méthode SimpleJdbcTestUtils.executeScript() pour charger mon fichier de script, en utilisant le code suivant:Script SimpleJdbcTestUtils.executeScript et multilignes

DriverManagerDataSource dataSource = ... // getting my DataSource defined in my Spring context 
SimpleJdbcTemplate template = new SimpleJdbcTemplate(dataSource); 
Resource resource = new ClassPathResource("/create-table.sql"); 
SimpleJdbcTestUtils.executeSqlScript(template, resource, true); 

Si j'écris chaque instruction SQL dans une ligne dans le fichier create-table.sql, puis tout c'est ok. Mais si j'écris une instruction sur plusieurs lignes, alors j'obtiens une erreur, même si l'instruction est terminée par un ;.

scénario de travail:

CREATE TABLE T_FOO (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP, IS_ACTIVE INTEGER DEFAULT 0 NOT NULL); 
CREATE TABLE T_BAR (ID NUMERIC PRIMARY KEY, DATEID TIMESTAMP, IS_ACTIVE INTEGER DEFAULT 0 NOT NULL); 

scénario de travail Non:

CREATE TABLE T_FOO (
    ID NUMERIC PRIMARY KEY, 
    DATEID TIMESTAMP, 
    IS_ACTIVE INTEGER DEFAULT 0 NOT NULL); 
CREATE TABLE T_BAR (
    ID NUMERIC PRIMARY KEY, 
    DATEID TIMESTAMP, 
    IS_ACTIVE INTEGER DEFAULT 0 NOT NULL); 

Erreur sur le deuxième fichier:

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [CREATE TABLE T_FOO (]; nested exception is java.sql.SQLException: Unexpected token: in statement [CREATE TABLE T_FOO (] 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:111) 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:404) 
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:519) 
    at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.update(SimpleJdbcTemplate.java:237) 
    at org.springframework.test.jdbc.SimpleJdbcTestUtils.executeSqlScript(SimpleJdbcTestUtils.java:150) 
    at org.springframework.test.jdbc.SimpleJdbcTestUtils.executeSqlScript(SimpleJdbcTestUtils.java:113) 
    at foo.bar.HsqldbUtils.run(HsqldbUtils.java:95) 
    at foo.bar.SomeUnitTest.executeTests(SomeUnitTest.java:63) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) 
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) 
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) 
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71) 
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) 
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) 
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
Caused by: java.sql.SQLException: Unexpected token: in statement [CREATE TABLE T_FOO (] 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source) 
    at org.springframework.jdbc.core.JdbcTemplate$1UpdateStatementCallback.doInStatement(JdbcTemplate.java:509) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:393) 

Comme je suis prêt à créer des tableaux plus complexes, je préfère écrire l'instruction SQL d'une manière plus lisible, donc en utilisant plusieurs lignes. Y-a-t-il un moyen de faire ça?

+0

WTF: http://efreedom.com/Question/1-2296468/SimpleJdbcTestUtilsexecuteScript-Multilines-Script? –

+0

@Boris Ce site semble avoir une copie de la question SO ... Besoin d'enquêtes à ce sujet. Merci. – romaintaz

+1

@Boris Regardez ceci: http://meta.stackexchange.com/questions/58369 Cela semble correct alors ... – romaintaz

Répondre

6

Vous utilisez Spring 2.5.2, mais en vous référant à la documentation 2.5.6.

Si vous regardez le javadoc pour 2.5.2 (voir here), vous remarquerez qu'il ne supporte pas les scripts multilignes.

Ceci a apparemment été résolu dans 2.5.4 (numéro here).

Vous devriez passer à 2.5.6, ou mieux encore, 3.0.x.

+0

Vous avez totalement raison! Je dois mettre à jour mon signet ou ma version de printemps en effet;) – romaintaz

+1

Printemps mis à jour à 2.5.6, le problème est résolu. Merci! – romaintaz