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

时间:2015-08-22 12:23:23

标签: java mysql string jpa bytearray

我正在使用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)?

1 个答案:

答案 0 :(得分:3)

我认为答案可以在CONCAT的{​​{3}}中找到:

  

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

official documentation部分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";