You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate 6.2注册自定义函数:如何指定ListArrayType返回类型

解决Hibernate 6.2中注册返回ListArrayType的自定义SQL函数问题

在Hibernate 6.2中,FunctionRegistry.registerPattern仅支持基础Java类型作为返回类型,无法直接传入ListArrayType实例。结合hypersistence-utils-hibernate-62版本,你可以通过以下步骤完成array_remove函数的注册:

1. 实现FunctionContributor接口

创建自定义的FunctionContributor实现类,通过Hibernate的TypeConfiguration获取ListArrayType对应的Hibernate Type实例,再基于该实例注册函数:

import org.hibernate.boot.model.FunctionContributor;
import org.hibernate.query.sqm.function.FunctionRegistry;
import org.hibernate.query.sqm.function.SQLFunctionTemplate;
import org.hibernate.type.Type;
import org.hibernate.type.spi.TypeConfiguration;
import io.hypersistence.utils.hibernate.type.array.ListArrayType;

public class PostgresCustomFunctionContributor implements FunctionContributor {
    @Override
    public void contributeFunctions(FunctionRegistry functionRegistry, TypeConfiguration typeConfiguration) {
        // 根据你的数组元素类型替换,比如String.class、Integer.class
        ListArrayType<String> listArrayType = ListArrayType.of(String.class);
        
        // 获取ListArrayType对应的Hibernate Type实例
        Type hibernateType = typeConfiguration.getTypeRegistry()
                .resolve(listArrayType);
        
        // 创建SQLFunctionTemplate并注册函数
        SQLFunctionTemplate arrayRemoveFunction = new SQLFunctionTemplate(
                hibernateType,
                "array_remove(?1, ?2)"
        );
        
        functionRegistry.register("array_remove", arrayRemoveFunction);
    }
}

2. 配置Hibernate加载FunctionContributor

在项目的src/main/resources/META-INF/services目录下创建文件org.hibernate.boot.model.FunctionContributor,文件内容为自定义FunctionContributor类的全限定名:

com.yourpackage.PostgresCustomFunctionContributor

(替换com.yourpackage为实际的包路径)

关键说明

  • ListArrayType是泛型类型,必须指定具体的元素类型(如String.class),对应PostgreSQL数组的元素类型。
  • 通过typeConfiguration.getTypeRegistry().resolve(listArrayType)可以将Hypersistence的自定义UserType转换为Hibernate 6兼容的Type实例,从而在SQLFunctionTemplate中使用。
  • 这种方式延续了Hibernate 5中SQLFunctionTemplate的使用逻辑,同时适配了Hibernate 6的新注册机制。

内容的提问来源于stack exchange,提问作者Poushali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:35:29