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

Spring Boot 6.2集成Hibernate 6时unaccent查询LIKE报错求助

解决Hibernate 6中unaccent函数返回值类型导致LIKE查询失败的问题

方法1:显式类型转换

在HQL中通过CAST函数将unaccent的结果强制转换为字符串类型,消除类型不匹配的问题:

@Query(value = "SELECT myentity FROM MyEntity myentity WHERE CAST(unaccent(LOWER(myentity.name)) AS string) LIKE CONCAT('%', :name, '%')")
List<MyEntity> searchByName(String search);

简化后的查询也可以用同样方式处理:

@Query(value = "SELECT myentity FROM MyEntity myentity WHERE CAST(unaccent(myentity.name) AS string) LIKE :search")
List<MyEntity> searchByName(String search);

方法2:全局注册自定义unaccent函数

如果项目中多处使用unaccent函数,可以全局注册一个返回String类型的unaccent函数,避免重复编写CAST:

  1. 创建自定义函数注册类:
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.FunctionContributor;
import org.hibernate.type.StandardBasicTypes;

public class UnaccentFunctionContributor implements FunctionContributor {
    @Override
    public void contributeFunctions(FunctionContributions functionContributions) {
        functionContributions.getFunctionRegistry()
                .registerPattern(
                        "unaccent",
                        "unaccent(?1)",
                        StandardBasicTypes.STRING
                );
    }
}
  1. 在src/main/resources/META-INF/services目录下创建文件org.hibernate.boot.model.FunctionContributor,写入自定义类的全类名:
com.yourpackage.UnaccentFunctionContributor

注册完成后,原HQL查询无需修改即可正常运行:

@Query(value = "SELECT myentity FROM MyEntity myentity WHERE unaccent(LOWER(myentity.name)) LIKE CONCAT('%', :name, '%')")
List<MyEntity> searchByName(String search);

方法3:使用数据库原生查询(可选)

如果仅针对特定数据库(如PostgreSQL,原生支持unaccent函数),可以改用原生SQL查询绕过HQL的类型校验:

@Query(value = "SELECT * FROM my_entity WHERE unaccent(LOWER(name)) LIKE CONCAT('%', :name, '%')", nativeQuery = true)
List<MyEntity> searchByName(String search);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:19:52