這段內容講的是 如何在 Apache Ignite 中創建和使用自定義 SQL 函數(Custom SQL Functions)。我們可以分步驟來理解它的含義和用法。
📚 一、什么是 Custom SQL Function?
Apache Ignite 的 SQL 引擎支持 標準 SQL 函數(如 COUNT、SUM、AVG 等),但有時這些內置函數無法滿足業務需求。
這時,你可以通過 編寫 Java 代碼,創建自己的 SQL 函數,并在 SQL 查詢中使用它們。
🧩 二、如何創建一個自定義 SQL 函數?
1. 創建一個 Java 類,包含一個 public static 方法
2. 使用 @QuerySqlFunction
注解標記該方法
示例代碼:
public class SqlFunctions {@QuerySqlFunctionpublic static int sqr(int x) {return x * x;}
}
- 這個方法
sqr(int x)
就是一個自定義 SQL 函數,表示“平方”。 - 你可以把它理解成 SQL 中的
SQRT()
或UPPER()
,只不過這個是你自己寫的。
🧱 三、如何注冊這個函數?
你需要將這個類注冊到 CacheConfiguration 中,這樣 Ignite 才知道它是一個 SQL 函數類。
// 創建緩存配置
CacheConfiguration cfg = new CacheConfiguration("myCache");// 注冊自定義 SQL 函數類
cfg.setSqlFunctionClasses(SqlFunctions.class);// 創建緩存
IgniteCache cache = ignite.createCache(cfg);
? 說明:
setSqlFunctionClasses(...)
方法用于注冊一個或多個包含自定義 SQL 函數的類。- 你可以在一個類中定義多個
@QuerySqlFunction
方法,每個方法都會變成一個 SQL 函數。
🧪 四、如何在 SQL 查詢中使用它?
一旦注冊成功,你就可以在 SQL 查詢中像使用內置函數一樣使用它。
// 使用自定義的 sqr 函數
SqlFieldsQuery query = new SqlFieldsQuery("SELECT name FROM myCache WHERE sqr(size) > 100");// 執行查詢
List<List<?>> result = cache.query(query).getAll();
- 這個查詢的意思是:選出
size
字段的平方大于 100 的所有記錄。 sqr(size)
就是你自己寫的 Java 方法。
📦 五、注意事項
1. 類必須部署到所有節點的 classpath 中
- 因為自定義函數可能在任意節點上執行,所以你必須確保這個類在集群中的 每個節點的 classpath 中都存在。
- 否則,執行時會拋出
ClassNotFoundException
。
2. 函數必須是 public static 方法
- 否則 Ignite 無法識別并調用它。
3. 參數和返回值類型必須是 SQL 支持的類型
- 例如:
int
,double
,String
,Date
等。 - 復雜對象或自定義類型可能無法被 SQL 引擎識別。
? 六、適用場景舉例
你可以用自定義 SQL 函數來:
- 實現復雜的業務邏輯(如自定義計算、格式化、規則判斷)
- 封裝常用計算,簡化 SQL 查詢語句
- 提高性能(在服務端節點本地執行,避免數據傳輸)
例如:
@QuerySqlFunction
public static boolean isAdult(int age) {return age >= 18;
}
SQL 查詢:
SELECT name FROM Person WHERE isAdult(age)
📌 總結
內容 | 說明 |
---|---|
自定義 SQL 函數 | 用 Java 編寫、在 SQL 查詢中使用的函數 |
標記方式 | 使用 @QuerySqlFunction 注解 |
注冊方式 | 通過 CacheConfiguration.setSqlFunctionClasses(...) |
使用方式 | 在 SQL 查詢中直接調用函數名 |
部署要求 | 類必須存在于所有節點的 classpath 中 |
方法要求 | 必須是 public static ,參數和返回值類型要兼容 SQL |