I have subject error in my Spring-boot application when running SELECT sql as part of integration tests.
However Spring-boot application start-up has no issues. I can see all the tables in H2 console after the application start-up.
Further despite getting said error in integration test when run the same SQL query in the H2 console it gives results as expected.
Error:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MY_TABLE1" not found (this database is empty); SQL statement:
SELECT PHD.ID, PRS.ID, PHD.*, PDT.*, PRS.*, PAD.* FROM MY_TABLE1 PHD JOIN MY_TABLE2 PRS ON PHD.REFERENCE_ID = PRS.REFERENCE_ID JOIN MY_TABLE3 PDT ON PDT.HEADER_ID = PHD.ID JOIN MY_TABLE4 PAD ON PAD.MY_HEADER_ID = PHD.ID AND PHD.REFERENCE_ID IN ('ABC6317000802') ORDER BY PHD.CREATED_TS, PDT.CREATED_TS, PRS.CREATED_TS, PAD.CREATED_TS, PAD.ID ASC [42104-214]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.get(DbException.java:199)
at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8385)
at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8369)
at org.h2.command.Parser.readTableOrView(Parser.java:8358)
at org.h2.command.Parser.readTablePrimary(Parser.java:1863)
at org.h2.command.Parser.readTableReference(Parser.java:2334)
at org.h2.command.Parser.parseSelectFromPart(Parser.java:2772)
at org.h2.command.Parser.parseSelect(Parser.java:2878)
at org.h2.command.Parser.parseQueryPrimary(Parser.java:2762)
at org.h2.command.Parser.parseQueryTerm(Parser.java:2633)
at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612)
at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605)
at org.h2.command.Parser.parseQueryExpression(Parser.java:2598)
at org.h2.command.Parser.parseQuery(Parser.java:2567)
at org.h2.command.Parser.parsePrepared(Parser.java:724)
at org.h2.command.Parser.parse(Parser.java:689)
at org.h2.command.Parser.parse(Parser.java:661)
at org.h2.command.Parser.prepareCommand(Parser.java:569)
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631)
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:92)
my application.yaml
spring:
cache:
enabled: false
datasource:
url: jdbc:h2:mem:myDB;DB_CLOSE_DELAY=-1;MODE=Oracle;IGNORECASE=TRUE
username: sa
password: 123
driverClassName: org.h2.Driver
flyway:
enabled: true
username: sa
password: 123
url: jdbc:h2:mem:myDB;DB_CLOSE_DELAY=-1;MODE=Oracle
baseline-on-migrate: true
locations: filesystem:C:\Repo\MyAPII\api\src\integrationTest
h2:
console:
enabled: true
path: /h2-console
I use below code to connect to the H2 db for data assertion during test execution. Perhaps here it can't see tables in H2 tables?
Test H2 db connectiond and SELECT query code:
Connection conn = null;
Statement stmt = null;
try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection("h2:mem:myDB","sa","123");
stmt = conn.createStatement();
String sql = "SELECT PHD.ID, PRS.ID, PHD.*, PDT.*, PRS.*, PAD.*....";
ResultSet rs = stmt.executeQuery(sql);
String metadataValue = "";
String strMetadata = "Status";
String intMetadata = 1;
while (rs.next()) {
metadataValue = strMetadata.isEmpty() || strMetadata.isBlank() ? rs.getString(intMetadata) : rs.getString(strMetadata);
}
statement.close();
conn.close();
Apparently this is kind of common issue. I tried almost all the solutions in below two threads