Java 类 CurveData 和 CurvePoint 关系及数据查询方法
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
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 的查询和处理。
原文地址: https://www.cveoy.top/t/topic/pdRI 著作权归作者所有。请勿转载和采集!