当前位置: 首页 > 知识库问答 >
问题:

对于具有“无方言映射…”的nvarchar字段,使用Sql ServerHibernate失败

景国兴
2023-03-14

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

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

它看起来很像Hibernate 4和SQL Server 2012没有针对JDBC类型-9的方言映射,或者没有针对JDBC类型-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。最终的jar
  • <代码>hibernate-entitymanager-4.3.10。最终的jar
  • <代码>hibernate-jpa-2.1-api-1.0.0。最终的jar
  • hibernate-commons-annotations-4.0.5。最终的jar
  • sqljdbc41。jar

我尝试过的:

  • 使用varchar而不是nvarchar可以使它工作,但我需要nvarchar

共有2个答案

梁丘安晏
2023-03-14

我能够通过对SQLServer方言进行子类化来解决这个问题:

package packagename;

import java.sql.Types;

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

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

}

并在我的持久性中引用它。xml:

        <property name="hibernate.dialect" value="packagename.SqlServerDialectWithNvarchar" />

PS:根据这张票据,似乎用hibernate 5.1修复了它:https://hibernate.atlassian.net/browse/HHH-10183

郑锦
2023-03-14

使用@国民化属性帮助我将String映射到MSSQL2012的nvarchar,而无需方言子类化。

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

更多信息,请查看文件中的国家字符类型。

 类似资料:
  • DBSchema-2表(用户和角色)具有多对多关系,并由postgres中的中间表(用户角色)桥接。我想获取所有角色和创建它的人的姓名。名称在用户表中可用,但所有其他详细信息在角色表中。Roles表中有一个由创建人(创建角色的人的用户id)创建的字段。 我正在尝试构建一个GET请求,以查看给定id的所有角色以及创建id的人的姓名 实体类Users1.java 实体类角色。JAVA 角色。存储库类

  • 我有一个对象,我正试图映射到。现在这个有一个名为的枚举,其中包含一些值。我想使用将它们映射到中的其他枚举值。以下是我到目前为止的代码: 当我尝试编译它时,我得到了错误:

  • 考虑以下示例代码,通过将每个字符串映射到其长度并打印每个映射条目来处理字符串列表 现在,我个人发现相当混乱或样板式的是使用(在1处),但是我找到的每个映射收集器都需要一个键映射器--是不是我忽略了某个收集器,或者如果需要的话,我必须定义我自己的收集器?如果有类似的东西

  • Navicat 会依源表或集合对字段类型和長度作出假设。你可以从下拉式菜单选择你所需的类型。 【提示】导入多个表或集合时,你可以从下拉式菜单选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或按住 Control 键并点按字段,然后选择“智慧匹配全部字段”、“按次序匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打

  • 我正在尝试在我的上测试我的。该控制器如下所示: 然而,当我在add方法中进行调试时发出post请求并查看boo对象时,字段都是空的。 请求正文: 请求标头设置为 Boo类: @data注释来自lombok,它为该类生成公共getter和setter等。

  • 我想映射2个模型,其中每个模型都有几乎相同的枚举。让我展示: 第一个模型有枚举: 第二个模型具有枚举: 我有这样的自定义映射方法: 然后我用: 但是你可以得到: 我还创建了枚举映射器,如: 但我不需要单独设置,只希望枚举字段映射到内部映射中。简单地说,当我做枚举时,也应该映射。 谢谢 p、 对不起我的英语,希望我的问题有意义:)