Spring Boot中无关联字段的业务表与单行参数表的关联查询实现方法
方案1:使用JPA的
@Formula注解(最贴合实体类直接使用的需求) @Formula可以将子查询结果直接映射到实体字段,因为表B仅有1行数据,无需关联条件直接查询即可,修改后的实体类如下:
@Getter @Setter @Entity @Table(name="tableA") public class TableA { // 类名首字母大写符合Java通用规范 @Id @Column(name = "id") private Long id; @Column(name = "code") private String code; // 新增字段,JPA查询时会自动执行子查询填充该字段值 @Formula("(select b.codeformat from tableB b)") private String codeFormat; }
你直接调用JPA自带的findAll()、findById()等查询方法时,codeFormat字段会自动赋值,无需额外编写SQL。
方案2:原生SQL查询+结果映射
如果不想用注解绑定子查询,也可以手动写原生SQL映射结果:
- 先修改实体类,添加结果映射配置和临时字段:
@Getter @Setter @Entity @Table(name="tableA") @SqlResultSetMapping( name = "TableAWithFormatMapping", entities = @EntityResult( entityClass = TableA.class, fields = { @FieldResult(name = "id", column = "id"), @FieldResult(name = "code", column = "code"), @FieldResult(name = "codeFormat", column = "codeformat") } ) ) public class TableA { @Id @Column(name = "id") private Long id; @Column(name = "code") private String code; @Transient // 标识该字段不需要持久化到数据库 private String codeFormat; }
- 在Repository层添加查询方法:
public interface TableARepository extends JpaRepository<TableA, Long> { @Query(nativeQuery = true, value = "select A.id, A.code , B.codeformat from tableA A inner join tableB B on 1=1", resultSetMapping = "TableAWithFormatMapping") List<TableA> findAllWithCodeFormat(); }
方案3:服务层组装(适合表B参数需要缓存的场景)
因为表B仅有1行数据,你可以把参数缓存到内存中,查询完表A数据后统一赋值,避免每次查询都关联表B:
@Service public class TableAService { @Autowired private TableARepository tableARepository; @Autowired private TableBRepository tableBRepository; // 缓存格式参数,表B更新时调用refreshCodeFormat()刷新即可 private String cachedCodeFormat; @PostConstruct public void refreshCodeFormat() { cachedCodeFormat = tableBRepository.findCodeFormat(); } public List<TableA> findAllWithFormat() { List<TableA> aList = tableARepository.findAll(); aList.forEach(item -> item.setCodeFormat(cachedCodeFormat)); return aList; } }
内容的提问来源于stack exchange,提问作者kpk
相关产品推荐
相关产品推荐

