我正在使用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);
问题是,myParam1
和myParam2
是nvarchar(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
中设置该变量的数据类型为文本。