基于Java Spring查询milestoneno=1且关联milestonestartedfrom的里程碑变更
实现方案
完全可行,以下是基于Spring生态的几种实现方案,同时适配你提到的List<Object[]>存储需求:
1. Spring Data JPA 实现
假设你的实体类Milestone对应数据库表的核心字段为:milestoneid、milestoneno、milestonetotalmonth、milestonestartedfrom(其中milestonestartedfrom关联同表的milestoneid,实现自关联)。
Repository层查询方法
import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import java.util.List; public interface MilestoneRepository extends CrudRepository<Milestone, Long> { // 查询milestoneno=1且关联milestonestartedfrom的里程碑,返回实体列表 @Query("SELECT m FROM Milestone m JOIN Milestone r ON m.milestonestartedfrom = r.milestoneid WHERE m.milestoneno = 1") List<Milestone> findRelevantMilestones(); // 查询指定字段,返回Object[]列表(适配你已有的存储逻辑) @Query("SELECT m.milestoneid, m.milestoneno, m.milestonetotalmonth, m.milestonestartedfrom " + "FROM Milestone m JOIN Milestone r ON m.milestonestartedfrom = r.milestoneid WHERE m.milestoneno = 1") List<Object[]> findRelevantMilestonesAsObjectArray(); }
业务层触发逻辑(milestonetotalmonth变更时调用)
@Service public class MilestoneService { private final MilestoneRepository milestoneRepo; // 构造注入替代@Autowired(推荐) public MilestoneService(MilestoneRepository milestoneRepo) { this.milestoneRepo = milestoneRepo; } public void onMilestoneTotalMonthChange(Long targetMilestoneId, Integer newTotalMonth) { // 更新milestonetotalmonth字段 Milestone targetMilestone = milestoneRepo.findById(targetMilestoneId) .orElseThrow(() -> new IllegalArgumentException("里程碑不存在")); targetMilestone.setMilestonetotalmonth(newTotalMonth); milestoneRepo.save(targetMilestone); // 执行查询获取关联里程碑 List<Object[]> relatedMilestones = milestoneRepo.findRelevantMilestonesAsObjectArray(); // 后续处理你的List<Object[]>数据 } }
2. MyBatis 实现
Mapper接口
import org.apache.ibatis.annotations.Select; import java.util.List; public interface MilestoneMapper { // 返回实体列表 @Select("SELECT * FROM milestone m JOIN milestone r ON m.milestonestartedfrom = r.milestoneid WHERE m.milestoneno = 1") List<Milestone> findRelevantMilestones(); // 返回Object[]列表 @Select("SELECT m.milestoneid, m.milestoneno, m.milestonetotalmonth, m.milestonestartedfrom " + "FROM milestone m JOIN milestone r ON m.milestonestartedfrom = r.milestoneid WHERE m.milestoneno = 1") List<Object[]> findRelevantMilestonesAsObjectArray(); }
业务层调用逻辑与JPA类似,只需注入MilestoneMapper执行查询即可。
核心逻辑说明
- 自关联查询:通过
milestonestartedfrom关联同表的milestoneid,筛选出有依赖关系的里程碑。 - 适配
List<Object[]>:直接指定查询字段而非整个实体,就能得到你需要的Object数组列表,无需额外转换。
内容的提问来源于stack exchange,提问作者Sankhasubhra Datta
相关产品推荐
相关产品推荐

