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

如何在JPA的orm.xml中获取List<Object[]>类型的查询结果?

如何在JPA的orm.xml中获取List<Object[]>类型的查询结果?

嘿,这个问题我之前也踩过坑!报错的核心原因是你大概率用了TypedQuery来执行这个多列返回的命名查询,但TypedQuery更适配单一实体或单个值的返回场景,当查询返回多列数据时,它没法把多列结果映射到你指定的类型,自然就报错了。

给你几个具体的解决步骤:

1. 调整Repository的查询调用逻辑

别用TypedQuery,改用普通的Query对象来执行查询。举个实际的代码例子:

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.util.List;

public class UserInfoRepository {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Object[]> findByCompCode() {
        // 创建命名查询,返回普通Query对象而非TypedQuery
        Query query = entityManager.createNamedQuery("UserInfo.findByCompCode");
        // getResultList会自动返回List<Object[]>类型,数组元素顺序和SQL列顺序一致
        return query.getResultList();
    }
}

之后你取数据时,Object[]的第一个元素就是USER_ID,第二个是USER_AREA_CODE,直接通过索引取值即可。

2. 修正orm.xml里的小语法错误

看你贴的配置代码,<query>标签没闭合,最后一行的<query>要改成</query>,不然JPA解析配置文件时可能出问题。修正后的命名查询部分如下:

<named-native-query name="UserInfo.findByCompCode" result-set-mapping="tmp">
    <query>
        SELECT
            A.USER_ID
            , B.USER_AREA_CODE
        FROM
             USER A
             , USER_DETAIL B
        WHERE
             A.USER_ID = B.USER_ID
             AND A.COMP_CODE = '01'
    </query>
</named-native-query>

至于你配置的sql-result-set-mapping是完全没问题的,用<column-result>映射列名刚好匹配返回Object数组的需求,不需要改成实体映射。

额外小提醒

如果之后你想避免用Object数组(担心索引取值容易出错),也可以创建一个DTO类,然后在sql-result-set-mapping里用<constructor-result>映射到DTO的构造方法,但既然你明确需要List<Object[]>,上面的方法就完全够用了。

备注:内容来源于stack exchange,提问作者KES

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:38:04