使用 concat() 时 JPA 本机查询返回字节数组而不是字符串

Posted

技术标签:

【中文标题】使用 concat() 时 JPA 本机查询返回字节数组而不是字符串【英文标题】:JPA native query returning byte array instead of string when using concat() 【发布时间】:2015-11-16 07:53:41 【问题描述】:

我正在使用 Play Framework、JPA 和 mysql,但我在 SQL 查询中遇到了concat() 函数的一些问题。当我在我的 MySQL GUI 中使用它时,它会输出连接列的正确值,但是当我在代码中将它与 JPA 一起使用时,它会返回 byte[],即一个字节数组。

我的实体:

@Entity
public class NumberData

    @javax.persistence.Id @GeneratedValue(strategy = GenerationType.AUTO)
    Long Id;

    @Column(unique = true)
    private Long numbr;

    @Column(unique = true)
    private String somekey;


我的选择查询:

String query="SELECT concat(somekey,id) as uid,numbr from numberdata";
List<Object[]> numList = JPA.em().createNativeQuery(query).getResultList();

但是当我尝试打印它时,它给了我一个字节数组:

for (Object[] ob : numList) 
    Logger.info("output "+ob[0]+"");    //output [B@48927

我知道我可以使用new String(ob[0]) 将其转换为字符串,但是由于 MySQL GUI 给了我正确的结果,这是 JPA 的问题吗?如何直接从 MySQL 查询中获取字符串(varchar)?

【问题讨论】:

在 JPA 中怎么可能是个问题? JPA 原生查询只是通过 JDBC 传递您的查询,因此您依赖于数据存储,并获得 JDBC 驱动程序为您提供的内容... 【参考方案1】:

我想答案可以在official documentationCONCAT中找到:

返回由连接参数产生的字符串。可能有一个或多个参数。如果所有参数都是非二进制字符串,则结果是非二进制字符串。如果参数包含任何二进制字符串,则结果为二进制字符串。

This 部分 JDBC 文档提示 CHARVARCHAR 如果是二进制字符串则转换为 byte[]

java.lang.String(除非列的字符集是 BINARY,否则返回 byte[]。

正如上面第一个链接中所建议的,非字符串参数的强制转换应该可以解决问题:

SELECT CONCAT(CAST(int_col AS CHAR), char_col);

在你的情况下,它看起来像这样:

String query= "SELECT concat(somekey,CAST(id AS CHAR)) as uid,numbr from numberdata";

【讨论】:

以上是关于使用 concat() 时 JPA 本机查询返回字节数组而不是字符串的主要内容,如果未能解决你的问题,请参考以下文章

jpa命名本机查询无结果

Spring JPA findAll 在更改 spring.datasource.url 后返回空,即使使用 SELECT * 的本机查询返回数据

如何在使用jpa条件查询的case语句中使用concat函数

JPA 本机查询问题

本机查询支持 SQL Server 的 Spring 数据 jpa 流

如何从 JPA 中的本机查询中提取别名