簡體   English   中英

編寫自定義 H2 DB 函數 Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM