Java 类 CurveData 和 CurvePoint 关系及数据查询方法

已知有两个类,CurveData 和 CurvePoint,关系是 1 对多。

CurveData 类:

public class CurveData extends BasePersistable {

    /**
     * 所属水表
     */
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    private WaterMeter waterMeter;

    /**
     * 曲线数据日期
     */
    @Column(nullable = false)
    private LocalDate curveDate;

    /**
     * 换算因子(曲线数据小数点位数)0:x1.0,1:x0.1,2:x0.01,3:x0.001,4:x0.0001
     */
    @Column(nullable = false, columnDefinition = "tinyint")
    private int factor;

    /**
     * 曲线密度
     */
    @Column(nullable = false, columnDefinition = "tinyint")
    private int density;

    /**
     * 数据是否完整
     */
    @Column(nullable = false)
    private boolean dataFull;

    /**
     * 是否已上报
     */
    @Column(nullable = false)
    private boolean reported;

    /**
     * 对应曲线数据
     */
    @ElementCollection
    @CollectionTable(name = "curve_point")
    @OrderBy("serialNo asc")
    private List<CurvePoint> curvePoints = new ArrayList<>();

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(nullable = false)
    private LocalDateTime createdDate;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime lastModifiedDate;
}

CurvePoint 类:

public class CurvePoint implements Serializable {

    /**
     * 序号
     */
    @Column(nullable = false, columnDefinition = "tinyint unsigned")
    private int serialNo;

    /**
     * 正向累计流量
     */
    @Column
    private Integer forwardVal;

    /**
     * 反向累计流量
     */
    @Column
    private Integer backwardVal;

    public boolean isAvailable() {
        return forwardVal != null && backwardVal != null;
    }

    public Integer getValue() {
        if (!isAvailable()) {
            return null;
        }
        return forwardVal - backwardVal;
    }
}

其中每天 CurveData 中有 48 个 curve_point,是按 serialNo 排序好的,例如第一个点是 serialNo=1,时间是 00:00;第二个点是 serialNo=2,时间是 00:30。

查询满足条件的 CurvePoint 并标记时间

可以通过以下代码实现从一个日期排序好的 List 中查询所有满足条件的 CurvePoint,并标记每个 CurvePoint 的时间:

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<CurveData> curveDataList = new ArrayList<>(); // 假设已有的日期排序好的 CurveData 列表

        List<CurvePoint> filteredCurvePoints = new ArrayList<>();
        for (CurveData curveData : curveDataList) {
            for (CurvePoint curvePoint : curveData.getCurvePoints()) {
                if (curvePoint.isAvailable()) {
                    // 满足条件的 CurvePoint,可以进行相应的处理
                    LocalTime time = getTimeFromSerialNo(curvePoint.getSerialNo());
                    curvePoint.setTime(time);
                    filteredCurvePoints.add(curvePoint);
                }
            }
        }

        // 输出满足条件的 CurvePoint 及其时间
        for (CurvePoint curvePoint : filteredCurvePoints) {
            System.out.println("CurvePoint: " + curvePoint);
            System.out.println("Time: " + curvePoint.getTime());
        }
    }

    private static LocalTime getTimeFromSerialNo(int serialNo) {
        int hours = (serialNo - 1) / 2;
        int minutes = (serialNo - 1) % 2 * 30;
        return LocalTime.of(hours, minutes);
    }
}

在上述代码中,通过遍历日期排序好的 CurveData 列表,然后遍历每个 CurveData 中的 CurvePoint,判断是否满足条件(isAvailable() 方法)。如果满足条件,则可以通过 getTimeFromSerialNo() 方法根据 CurvePoint 的 serialNo 获取对应的时间。然后将时间设置到 CurvePoint 的 time 属性中,并将满足条件的 CurvePoint 添加到 filteredCurvePoints 列表中。

最后,可以输出满足条件的 CurvePoint 及其时间进行验证。请根据实际需求对满足条件的 CurvePoint 进行相应的处理。

注意:

  • 上述代码中假设 CurvePoint 类已经添加了 setTime() 方法,用于设置时间属性。
  • 实际代码中可能需要根据具体情况修改 getTimeFromSerialNo() 方法的逻辑,例如考虑不同时间间隔的场景。
  • 满足条件的 CurvePoint 的处理方式可以根据实际需求进行调整。

希望本文能够帮助您更好地理解 CurveData 和 CurvePoint 的关系,并实现对满足条件的 CurvePoint 的查询和处理。

Java 类 CurveData 和 CurvePoint 关系及数据查询方法

原文地址: https://www.cveoy.top/t/topic/pdRI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录