获取Hibernate以绑定参数类型" char(1)"而不是" nvarchar(4000)"?

时间:2014-03-19 19:48:10

标签: sql hibernate jdbc

数据库端:SQL Server 2012.数据列是char(1)数据类型。

ORM:Hibernate

意图:Hibernate Query可以正确绑定参数,因此查询中没有隐式数据类型转换。

//not working as I intend. DB side still sees nvarchar(4000) 
Query.setCharacter("paramName", myChar)

Query.setParameter("paramName", myChar, Hibernate.Type.CHARACTER)

Query.setString("paramName", myCharStr)

上述变化均无效。 SQL server profiler指示绑定参数类型为navarchar(4000)。 SQL Server在运行查询时最终会进行一些隐式数据类型转换,这搞砸了我最初的一些意图。 (Rare and elusive deadlocks (select for update; then update) in case of multiple concurrent transactions

另外我注意到JDBC PreparedStatement API甚至没有" setCharacter()"。不确定这是否意味着什么。 (http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html

有没有办法实现绑定固定长度char的意图,而不是nvarchar?

1 个答案:

答案 0 :(得分:1)

实际上它不是Hibernate的问题。而是在此特定db列上设置的排序规则与DB排序规则不同。一旦修复了此数据列上的排序规则,则上述任何Hibernate方法变体都可以绑定正确的参数类型。如果其他人遇到类似的问题。

编辑:另一个重要设置是" sendStringParametersAsUnicode "。 SQL Server JDBC驱动程序默认发送字符为" nvarchar"或" nchar",除非你附加" sendStringParametersAsUnicode = false"在您的连接字符串中;

http://technet.microsoft.com/en-us/library/ms378988.aspx http://blogs.msdn.com/b/sqlcat/archive/2010/04/05/character-data-type-conversion-when-using-sql-server-jdbc-drivers.aspx