![](/img/trans.png)
[英]How to create a dummy function in H2 embbeded db for integration test
[英]Write custom H2 DB function Java
我正在嘗試使用 H2DB(通過 junit 測試)運行以下代碼,同時我收到如下錯誤消息。 我知道,在 H2 中沒有可用作“天”的函數。 所以我正在嘗試編寫一個自定義函數,但它不起作用,任何人都可以幫助編寫此函數。
SQLBuilder 類代碼:
public String dummy() {
return new StringBuilder(new SQL() {
{
SELECT("date(CREATE_TMS)");
SELECT("CASE WHEN date(CREATE_TMS) >= (CURRENT DATE - cast('1' AS integer) days) THEN 'Y' ELSE 'N' END NEW_B");
FROM("Q.DUMMY");
}
}.toString().concat(" FOR READ ONLY WITH UR")).toString();
}
錯誤信息:
org.springframework.jdbc.BadSqlGrammarException:
### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT DATE(CREATE_TMS), CASE WHEN DATE(CREATE_TMS) >= (CURRENT DATE - CAST('1' AS INTEGER) DAYS[*]) THEN 'Y' ELSE 'N' END NEW_BILLING
FROM Q.DUMMY FOR READ ONLY WITH UR "; expected "[, ::, *, /, %, +, -, ||, ~, !~, NOT, LIKE, ILIKE, REGEXP, IS, IN, BETWEEN, AND, OR, ,, )"; SQL statement:
SELECT date(CREATE_TMS), CASE WHEN date(CREATE_TMS) >= (CURRENT DATE - cast('1' AS integer) days) THEN 'Y' ELSE 'N' END NEW_BILLING
FROM Q.DUMMY FOR READ ONLY WITH UR [42001-199]
由於某種原因,天數被轉換為DAYS[*] ,我們可以在錯誤消息中看到這一點。
我在 schema-db2.sql 中嘗試過的客戶方法:
drop ALIAS if exists days;
CREATE ALIAS days as '
import java.lang.String;
@CODE
java.lang.String days() throws Exception {
return "days";
}
';
應用程序屬性:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;Mode=DB2
DAYS
不是一個函數,也不是其他數據庫支持的東西。 Db2 還使用非標准區間文字。
如果您可以從其當前來源構建 H2,您可以在其中使用cast('1' AS integer) day
(而不是 day s )並且 Db2 也支持這種構造。 您也可以簡單地使用1 DAY
,它也被當前的 H2 和 Db2 支持。
(CURRENT_DAY - 1 DAY)
H2 的來源可在 GitHub 上獲得:
https://github.com/h2database/h2database
構建說明在這里:
https://h2database.com/html/build.html#building
你需要一個jar
目標。
要從當前源編譯 H2,您需要 JDK 8、9、10、11 或 12。編譯的 jar 將與更新的版本兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.