我正在使用Hibernate的JPA-Implementation来访问我们的SQL Server 2012数据库。
当尝试在本机查询中选择nvarchar
字段时,我得到一个例外“JDBC类型的无方言映射:-9”。
它看起来很像No Dialect mapping for JDBC type: -9 with Hibernate 4 and SQL Server 2012或No Dialect mapping for JDBC type: -9,但我找不到适合我的解决方案(两者都没有使用JPA)。
我的数据库设置:
CREATE TABLE NvarcharExample(
exampleField nvarchar(20) PRIMARY KEY
)
INSERT INTO NvarcharExample(exampleField) VALUES ('hello')
我的代码:
import java.io.IOException;
import javax.persistence.*;
@Entity
class NvarcharExample {
@Id
public String exampleField;
}
public class NvarcharTest {
public static void main(String[] args) throws IOException, InterruptedException {
String queryString = "SELECT e.exampleField FROM NvarcharExample e";
// establish connection
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnit");
try {
EntityManager entityManager = entityManagerFactory.createEntityManager();
// access data using JPQL
entityManager.createQuery(queryString).getResultList(); // works
// access data using SQL (native query)
entityManager.createNativeQuery(queryString).getResultList(); // fails
} finally {
entityManagerFactory.close();
}
}
}
我的persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="persistenceUnit">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- database connection settings -->
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://<servername>:<port>;databaseName=<databasename>" />
<property name="javax.persistence.jdbc.user" value="<user>" />
<property name="javax.persistence.jdbc.password" value="<password>" />
</properties>
</persistence-unit>
</persistence>
启用sql logging后,我在控制台中获得此输出
select nvarcharex0_.exampleField as col_0_0_ from NvarcharExample nvarcharex0_
SELECT e.exampleField FROM NvarcharExample e
我正在使用
hibernate-core-4.3.10.Final.jar
hibernate-entitymanager-4.3.10.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
hibernate-commons-annotations-4.0.5.Final.jar
sqljdbc41.jar
我尝试了什么:
varchar
代替nvarchar
使其有效,但我需要nvarchar
sqljdbc4.jar
,我尝试了sqljdbc41.jar
<property name="dialect" value="org.hibernate.dialect.SQLServerDialect" />
添加到我的persistence.xml
(密码属性后面)<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
persistence.xml
<provider>org.hibernate.ejb.HibernatePersistence</provider>
答案 0 :(得分:5)
我能够通过继承SQLServerDialect来解决这个问题:
package packagename;
import java.sql.Types;
public class SqlServerDialectWithNvarchar extends org.hibernate.dialect.SQLServerDialect {
public SqlServerDialectWithNvarchar() {
registerHibernateType(Types.NVARCHAR, 4000, "string");
}
}
并在我的persistence.xml
中引用它:
<property name="hibernate.dialect" value="packagename.SqlServerDialectWithNvarchar" />
PS:我在https://hibernate.atlassian.net/browse/HHH-9750找到了一个问题报告,描述了类似的行为和解决方案(针对Oracle数据库)。
答案 1 :(得分:4)
使用@Nationalized
属性帮助我在没有方言子类化的情况下将String
映射到nvarchar for MS SQL 2012。
同时将hibernate.use_nationalized_character_data
属性设置为true对我没有用。
有关更多信息,请观看文档National Character Types。