SQL Server MSSQL - JPA -特殊字符的字符编码-附加“N”nativeQuery

30byixjq  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(129)

我正在使用Spring 4.3.1和JPA 2.0,并连接到MSSQL。我正在使用JpaRepository的保存方法插入和更新数据。其中一个字段有nvarchar,它可以包含特殊字符,如拉丁文、中文。
此外,我还在applicationContext-hibernate.xml中设置了以下JPA属性。

<prop key="hibernate.connection.CharSet">UTF-8</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>

当我保存数据时,所有的特殊字符都被保存为问号(??)。建议的解决方案是在更新查询前追加'N'以保持插入的特殊字符。但是,我在JpaRepository的save方法中没有看到任何地方如何追加'N'。有什么建议吗?

cnh2zyt3

cnh2zyt31#

将字段声明为byte[]数组,如下所示。

@Column(name="[colName]", columnDefinition = "nvarchar", length=4000)
    private byte[] colName;

在Map的时候,你必须使用UTF-16将byte[]转换成String,这样做的技巧如下。

byte[] eCodeData = dbData.getColName();
            if(eCodeData != null){
                uiData.setColName(new String(eCodeData, StandardCharsets.UTF_16));
            }

至DB:

String eCodeData = uiData.getColName();
        if(eCodeData != null){
            dbData.setColName(eCodeData.getBytes(StandardCharsets.UTF_16)); 
        }

就是这个,会有魔力的.

xmd2e60i

xmd2e60i2#

实际上不必为字段定义byte[] array

@Column(columnDefinition = "nvarchar(255)")
private String colName;

够了

ql3eal8s

ql3eal8s3#

也许这对其他人有帮助,因为我是在研究stackoverflow中的所有文章的过程中来的。(Java/Jboss/Hibernate/JPA/M$ SqlServer)运行良好,正确处理了来自UI输入的字符串。但我也通过EJB将一些数据加载到数据库中。这里,带有德语Umlaute的字符串损坏并Map错误。*.java使用UTF-8正确编码,所有工具都显示UTF-8编码。
我遵循了所有的建议,在互联网/stackoverflow.使用

  • 编码
  • 发送字符串参数作为Unicode =
  • 扩展SQL服务器方言

什么都帮不上忙。
最后我发现了问题。我是一个Gradle问题。我正在调用javac编译器:

tasks.withType(JavaCompile) {
    options.with {
        fork = true
        forkOptions.executable = "${jdk8base}/bin/javac"
    }
}

在我的环境中,源代码没有被解释为UTF-8编码,所以编译后的 *.class被解释为拉丁语。EJB正在将拉丁语加载到DB(JPA)中。
解决方案:

tasks.withType(JavaCompile) {
    options.with {
        encoding = 'UTF-8'
        fork = true
        forkOptions.executable = "${jdk8base}/bin/javac"
    }
}

所以:@Column(columnDefinition =“nvarchar(255)”)就足够了。

相关问题