2010-02-19 27 views
8

Tôi muốn tải tập lệnh SQL cho các bài kiểm tra đơn vị của mình. Như tôi đang sử dụng Spring 2.5.2, tôi decided để sử dụng phương pháp SimpleJdbcTestUtils.executeScript() để tải tập tin kịch bản của tôi, sử dụng đoạn mã sau:SimpleJdbcTestUtils.executeScript và multilines script

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); 

Nếu tôi viết mỗi câu lệnh SQL trong một dòng trong create-table.sql tập tin, sau đó tất cả mọi thứ được rồi. Nhưng nếu tôi viết một tuyên bố trên nhiều dòng, sau đó tôi nhận được một lỗi, ngay cả khi tuyên bố được hoàn thành bởi một ;.

kịch bản làm việc:

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); 

kịch bản Không làm việc:

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); 

Lỗi trong hồ sơ thứ hai:

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) 

Như tôi đã sẵn sàng để tạo bảng phức tạp hơn, tôi thích viết hướng dẫn SQL theo cách dễ đọc hơn, vì vậy hãy sử dụng một vài dòng. Có cách nào làm được việc này không?

+0

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

+0

@Boris Trang web này dường như có một bản sao của câu hỏi SO ... Cần một số điều tra về điều đó. Cảm ơn. – romaintaz

+1

@Boris Hãy nhìn vào điều này: http://meta.stackexchange.com/questions/58369 Có vẻ như OK ... – romaintaz

Trả lời

6

Bạn đang sử dụng Spring 2.5.2, nhưng đề cập đến tài liệu 2.5.6.

Nếu bạn xem javadoc cho 2.5.2 (xem here), bạn sẽ lưu ý rằng nó không hỗ trợ các tập lệnh đa dòng.

Điều này dường như đã được giải quyết trong 2.5.4 (phát hành here).

Bạn nên nâng cấp lên 2.5.6 hoặc tốt hơn, 3.0.x.

+0

Bạn hoàn toàn đúng! Tôi phải cập nhật bookmark hoặc phiên bản Spring của mình thực sự;) – romaintaz

+1

Spring cập nhật lên 2.5.6, vấn đề được giải quyết. Cảm ơn! – romaintaz

Các vấn đề liên quan