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

Spring Boot JpaRepository如何避免创建实体类返回多表查询对象列表

Spring Data JPA 原生查询避免创建实体的实现方案

方案1:直接返回Object数组

直接修改Repository接口方法的返回值为List<Object[]>即可,原生查询未指定实体映射时,默认会按查询字段顺序返回Object数组集合:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

// 无需绑定具体实体,泛型填Object即可
public interface DemoRepository extends JpaRepository<Object, String>{
    @Query(nativeQuery = true,value="SELECT t1.*, t2.DEMO2_NAME FROM DEMO1 as t1 LEFT JOIN DEMO2 as t2 ON t1.ID = t2.ID")
    List<Object[]> get();
}

返回结果的使用方式:

  • 数组下标和查询字段顺序完全对应:前50个元素为DEMO1表的字段,第51个元素为DEMO2_NAME字段
  • 取值时按字段实际类型强转即可:
List<Object[]> result = demoRepository.get();
for (Object[] row : result) {
    // 示例:取DEMO1的ID字段(假设是查询返回的第一个字段,类型为String)
    String id = (String) row[0];
    // 取关联的DEMO2_NAME字段
    String demo2Name = (String) row[50];
    // 其余字段按顺序按需取值即可
}

方案2:用Tuple类型返回(优化取值方式)

如果不想按下标取值容易出错,可以用JPA自带的Tuple类型,支持按字段名直接取值:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.JpaRepository;
import javax.persistence.Tuple;
import java.util.List;

public interface DemoRepository extends JpaRepository<Object, String>{
    @Query(nativeQuery = true,value="SELECT t1.*, t2.DEMO2_NAME FROM DEMO1 as t1 LEFT JOIN DEMO2 as t2 ON t1.ID = t2.ID")
    List<Tuple> get();
}

返回结果的使用方式:

List<Tuple> result = demoRepository.get();
for (Tuple row : result) {
    // 直接按数据库字段名取值,无需记下标
    String id = row.get("ID", String.class);
    String demo2Name = row.get("DEMO2_NAME", String.class);
}

注意:如果两张表存在同名字段,需要给字段加别名,例如t1.NAME as DEMO1_NAME,取值时用别名即可避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:15:00