如何在H2数据库中正确传递数组作为自定义函数参数?
解决H2数据库数组包含函数报错问题
错误原因
你遇到的Hexadecimal string contains non-hex character错误,是因为H2数据库不识别Array['HELLO', ...]这种数组写法——H2会把这种格式误解析为十六进制字符串(类似X'...'的语法),而字符串里的字母不是十六进制字符,因此抛出错误。
修正步骤
1. 正确创建函数别名
针对字符串数组场景,使用String[]作为参数类型(需支持其他类型可调整),函数内部将数组转为集合后调用containsAll:
CREATE ALIAS IF NOT EXISTS array_contains_all AS ' boolean arrayContainsAll(String[] sourceArray, String[] subArray) { java.util.Set<String> sourceSet = new java.util.HashSet<>(java.util.Arrays.asList(sourceArray)); return sourceSet.containsAll(java.util.Arrays.asList(subArray)); }';
2. 使用H2合法的数组构造语法调用函数
H2中构造数组需要用ARRAY(...)语法(或CAST语法兼容旧版本):
-- 标准调用方式 SELECT array_contains_all(ARRAY('HELLO', 'WORLD', 'FRIEND'), ARRAY('HELLO', 'WORLD')); -- 兼容旧版本H2的CAST写法 SELECT array_contains_all(CAST(('HELLO', 'WORLD', 'FRIEND') AS VARCHAR ARRAY), CAST(('HELLO', 'WORLD') AS VARCHAR ARRAY));
通用场景扩展
如果需要支持任意类型的数组,可将参数改为Object[],函数逻辑调整为:
CREATE ALIAS IF NOT EXISTS array_contains_all AS ' boolean arrayContainsAll(Object[] sourceArray, Object[] subArray) { java.util.Set<Object> sourceSet = new java.util.HashSet<>(java.util.Arrays.asList(sourceArray)); return sourceSet.containsAll(java.util.Arrays.asList(subArray)); }';
调用时只需保证两个数组的元素类型一致即可。
内容的提问来源于stack exchange,提问作者Евгений Дорджиев
相关产品推荐
相关产品推荐

