带有"无方言映射..."的nvarchar字段的Hibernate与Sql Server失败

sla*_*dan 5 java sql-server hibernate jpa

我正在使用Hibernate的JPA-Implementation来访问我们的SQL Server 2012数据库.

当尝试nvarchar在本机查询中选择一个字段时,我得到一个异常"JDBC类型的无方言映射:-9".

它看起来很像JDBC类型的No Dialect映射:-9使用Hibernate 4和SQL Server 2012JDBC类型的No Dialect映射:-9但是我找不到解决方案(两者都没有使用JPA).

我的数据库设置:

CREATE TABLE NvarcharExample(
    exampleField nvarchar(20) PRIMARY KEY
)

INSERT INTO NvarcharExample(exampleField) VALUES ('hello')
Run Code Online (Sandbox Code Playgroud)

我的代码:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

使用sql logging enable,我在控制台中获得此输出

select nvarcharex0_.exampleField as col_0_0_ from NvarcharExample nvarcharex0_
SELECT e.exampleField FROM NvarcharExample e
Run Code Online (Sandbox Code Playgroud)

我正在使用

  • 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

我尝试过的:

  • 使用a varchar代替nvarchar使其工作,但我需要nvarchar
  • 使用jpql而不是sql工作(参见我的示例代码),但我需要一个本机查询
  • 我试过sqljdbc4.jar版本4.0和4.1,我尝试过sqljdbc41.jar
  • 我主要关注SQL Server Dialect类的子类化,但是没有取得任何成功
  • 我添加<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>

art*_*art 8

使用@Nationalized属性帮助我在String没有方言子类化的情况下映射到 MS SQL 2012 的 nvarchar。

同时将hibernate.use_nationalized_character_data属性设置为 true 对我不起作用。

有关更多信息,请观看文档National Character Types

  • 好吧,JPQL 查询工作正常,只有本机查询会导致麻烦。使用本机查询(没有实体作为结果类)时,我可以将“@Nationalized”放在哪里? (2认同)

sla*_*dan 5

我能够通过继承SQLServerDialect来解决这个问题:

package packagename;

import java.sql.Types;

public class SqlServerDialectWithNvarchar extends org.hibernate.dialect.SQLServerDialect {

    public SqlServerDialectWithNvarchar() {
        registerHibernateType(Types.NVARCHAR, 4000, "string");
    }

}
Run Code Online (Sandbox Code Playgroud)

并在我的参考中引用它persistence.xml:

        <property name="hibernate.dialect" value="packagename.SqlServerDialectWithNvarchar" />
Run Code Online (Sandbox Code Playgroud)

PS:我在https://hibernate.atlassian.net/browse/HHH-9750上找到了一个问题报告,描述了类似的行为和解决方案(适用于Oracle数据库).