如何在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
相关产品推荐
相关产品推荐

