这段内容讲的是 如何在 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 {
@QuerySqlFunction
public 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 |