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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:20:29