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

