You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java执行SQL原生查询后如何转为字符串/对象列表(无POJO)

解决JPA原生查询返回数组内存地址的问题

问题原因

当使用EntityManager.createNativeQuery("select * from table2")执行原生查询时,JPA默认返回List<Object[]>类型的结果——每个Object[]对应数据库表的一行数据,数组中的每个元素对应该行的一列值。直接打印这个列表时,Java会输出数组的哈希标识(即你看到的[Ljava.lang.Object;@xxx),而非实际数据。

解决方案

1. 将每行数据转为字符串(自定义格式)

遍历结果列表,把每个对象数组的元素拼接成字符串,可自定义分隔符或格式:

protected EntityManager em;
Query query = em.createNativeQuery("select * from table2");
List<Object[]> resultRows = query.getResultList();
List<String> stringResult = new ArrayList<>();

for (Object[] row : resultRows) {
    // 处理null值避免空指针,用竖线分隔列值,可按需修改格式
    String rowString = String.join(" | ", Arrays.stream(row)
                                                .map(val -> val != null ? val.toString() : "NULL")
                                                .toArray(String[]::new));
    stringResult.add(rowString);
}
// 此时stringResult中存储的是每行数据的字符串形式

2. 将数组转为List存储

如果需要保留原始数据类型但不想用数组,可以把每个Object[]转为List<Object>:

protected EntityManager em;
Query query = em.createNativeQuery("select * from table2");
List<Object[]> resultRows = query.getResultList();
List<List<Object>> objectResult = new ArrayList<>();

for (Object[] row : resultRows) {
    objectResult.add(Arrays.asList(row));
}
// 打印objectResult时会显示每行的具体元素,而非内存地址

3. 只查询指定列(直接得到单一类型列表)

如果不需要整行数据,仅需某一列,修改SQL指定列名,JPA会直接返回该列类型的列表:

// 示例:仅查询name列(假设该列是字符串类型)
protected EntityManager em;
Query query = em.createNativeQuery("select name from table2");
List<String> nameList = query.getResultList();
// 直接得到字符串列表,无需处理数组

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:20:17