Hibernate原生查询String参数转NVARCHAR(4000)引发性能问题怎么解决?
解决方案
以下几种方法都可以解决String类型参数默认映射为NVARCHAR(4000)的问题:
- 方法一:SQL层面显式转换参数类型
该方法兼容性最高,无需额外依赖或配置,直接修改原生SQL语句,对参数做长度限定即可:
@Modifying @Query(value = "INSERT INTO MyTable (a, b, c) SELECT CAST(:myParam1 AS NVARCHAR(100)), CAST(:myParam2 AS NVARCHAR(100)), a.xpto FROM myTable a WHERE a.id = :myParam3", nativeQuery = true) void insertMyTable(@Param("myParam1") String myParam1, @Param("myParam2") String myParam2, @Param("myParam3") int myParam3);
- 方法二:参数上添加@Type注解显式指定类型和长度
如果不想修改SQL语句,可以在方法参数上使用Hibernate提供的@Type注解指定参数的实际类型和长度:
@Modifying @Query(value = "INSERT INTO MyTable (a, b, c) SELECT :myParam1, :myParam2, a.xpto FROM myTable a WHERE a.id = :myParam3", nativeQuery = true) void insertMyTable( @Param("myParam1") @org.hibernate.annotations.Type(type = "nvarchar", parameters = @org.hibernate.annotations.Parameter(name = "length", value = "100")) String myParam1, @Param("myParam2") @org.hibernate.annotations.Type(type = "nvarchar", parameters = @org.hibernate.annotations.Parameter(name = "length", value = "100")) String myParam2, @Param("myParam3") int myParam3 );
- 方法三:自定义SQL Server方言全局修改默认映射
如果你项目中所有String类型参数对应的数据库字段长度都统一,可以通过自定义方言的方式全局修改默认的字符串类型映射规则:
- 编写自定义方言类
public class CustomSQLServer2008Dialect extends org.hibernate.dialect.SQLServer2008Dialect { public CustomSQLServer2008Dialect() { super(); // 调整默认长度为100,可根据实际业务场景修改 registerColumnType(java.sql.Types.NVARCHAR, "nvarchar($l)"); registerColumnType(java.sql.Types.VARCHAR, 100, "nvarchar($l)"); } }
- 修改配置文件中的Hibernate方言配置,将
hibernate.dialect的值改为你自定义方言类的全限定名即可。
内容的提问来源于stack exchange,提问作者Lucas Freitas
相关产品推荐
相关产品推荐

