2011-12-01 2 views
1

나는이 DB2에 대해 직접 실행할 때 좋은 일 다음 쿼리 :DB2 구문 (DB2 모드에서) H2를 실행할 때

String sql = 
"select slutt_dato + 1 day as tDato from klv80201 " + 
"union " + 
"select fra_dato as tDato from klv12101 where avtalenr = :avtalenr and kundenr = :kundenr " + 
"union " + 
"select fra_dato as tDato from klv12401 where avtalenr = :avtalenr and kundenr = :kundenr and MEDLEMSTATU < '32' " + 
"order by tDato desc fetch first 1 rows only;"; 

을하지만, 나는 다음과 같은 구성으로 데이터베이스로 H2와 테스트를 통해 실행할 때 :

jdbc:h2:mem:play;MODE=DB2;LOCK_TIMEOUT=10000;LOCK_MODE=0 

나는 다음과 같은 오류 메시지가 얻을 :

org.h2.jdbc.JdbcSQLException : 열은 "SLUTT_DATO는"을 (를) 찾을 수 없습니다; SQL 선언문 : klv80201 유니온에서 tDato로 slutt_dato + 1 day를 선택하십시오. klv12101에서 fra_dato를 tDato로 선택하십시오. 여기서 avtalenr =? 및 kundenr =? union klv12401에서 tDato로 fra_dato를 선택하십시오. 여기서 avtalenr =? 그리고 kundenr =? 및 MEDLEMSTATU < tDato에 의해 '32'order first fetch 1 행만; [42122-149]

"+1 일"을 삭제하면 H2에서 좋은 결과를 얻을 수 있습니다. H2 JDBC 드라이버의 오류 메시지가 잘못되어 "SLUTT_DATO"열이 존재하며 "+1 일"을 제거 할 때 유용합니다.

H2가 왜 그렇게 행동하는지 좋은 제안이 있습니까? 그것은 버그입니까, 아니면 저를 오해하는 것입니까? 사전에

덕분에

답변

0

H2는 + 1 day을 이해하지 않고 여기에 혼동됩니다. 그러나 이것은 작동합니다 :

"select slutt_dato + 1 as tDato from klv80201 " 

하지만이 IBM DB2에 대한 작업 ... 나는 IBM DB2와 H2 모두에서 작동이 문제에 대한 쉬운 해결책이 있다고 생각하지 않는 것 같군요.

+0

음, 알 수 있습니다. 나는 이것을 "해킹"으로 해결했다 문자열 plusADay; if (Play.id.equals ("test")) { plusADay = "1"; // H2 모드 } else { plusADay = "1 day"; // DB2 모드 } –