gpt4 book ai didi

java - 使用 Sql Server 的 Hibernate 因 nvarchar 字段失败而出现 "No Dialect mapping..."

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:44 27 4
gpt4 key购买 nike

我正在使用 Hibernate 的 JPA 实现来访问我们的 SQL Server 2012 数据库。

尝试选择 nvarchar 时 native 查询中的字段,我得到一个异常“没有 JDBC 类型的方言映射:-9”。

它看起来很像 No Dialect mapping for JDBC type: -9 with Hibernate 4 and SQL Server 2012No 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 日志记录后,我在控制台中得到此输出

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
  • 使用 jpql 而不是 sql 可以工作(参见我的示例代码),但我需要一个 native 查询
  • 我试过了 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>

最佳答案

使用 @Nationalized 属性帮助我将 String 映射到 MS SQL 2012 的 nvarchar,无需方言子类化。

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

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

关于java - 使用 Sql Server 的 Hibernate 因 nvarchar 字段失败而出现 "No Dialect mapping...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com