@Param("myParam") 字符串 myParam 是 Cast to NVARCHAR(4000)



我正在使用Hibernate (Spring 2.0.8)编写一个简单的本机查询,但是当我的参数是一个String时,它被强制转换为NVARCHAR(4000),这会导致性能问题。

下面是我的代码示例

@Modifying
@Query(value = "INSERTO INTO MyTable (a, b, c) SELECT :myParam1, :myParam2, 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);

问题是,myParam1myParam2nvarchar(100)(示例),但是当我们将分析器附加到SQLServer2008实例时,我们发现执行以下查询

@P0 NVARCHAR(4000), @P1 NVARCHAR(4000), @P2 INTEGER
INSERTO INTO MyTable (a, b, c) SELECT @P0, @P1, a.xpto FROM myTable a WHERE a.id = @P2

这会导致从NVARCHAR(4000)NVARCHAR(100)的转换,从而导致性能问题。

是否有任何方式显式声明@Param与它各自的大小?比如@Param("myParam1", "nvarchar(100)")

您可以使用@Column注释来指定列的数据类型

@Column(columnDefinition="VARCHAR(40)") 
private String columnName;

@Column(columnDefinition="text") 
private String columnName;

您可以将该变量的columnDefinition声明为模型类中的文本(这样对该变量没有限制)这样的

@Column(name = "content", columnDefinition = "text")
private String content;

or你可以直接在database中设置该变量的数据类型为文本。

最新更新