基于Spring数据JPA中实体字段数据的百分比计算



如果实体在数据库记录中有10个字段,5个字段有数据,而5个字段没有数据,则该实体记录的百分比为50%。

我们如何使用Spring数据jpa或Java 中的任何现有库进行计算

您可以尝试在实体类的瞬态字段中使用Reflection。

@Transient
public float getPercentDone() {
var propDesc = BeanUtilsBean2.getInstance().getPropertyUtils().getPropertyDescriptors(this);
var allProps = Arrays.stream(propDesc).filter(prop -> !"percentDone".equals(prop.getName()))
.collect(Collectors.toList());
var countNotNull = allProps.stream().filter(prop -> {
try {
return BeanUtilsBean2.getInstance().getProperty(this, prop.getName()) != null;
} catch (Exception e) {
return false;
}
}).count();
return (countNotNull * 100.0f) / allProps.size();
}

我使用了Apache Commons中的BeanUtils,但如果你不能使用它,你可以用开箱即用的反射来做同样的事情(只是时间更长(。

跳过字段

要跳过id和联接字段等字段,可以创建一个列表。并将筛选器替换为检查跳过属性列表的筛选器。如果将其放在@MappedSuperclass中,则实体子级只需要覆盖该列表。

注意percentDoneskippedProperties本身都必须跳过字段。

List<String> skippedProperties = List.of("percentDone", "skippedProperties", "id", "user");
...
@Transient
public float getPercentDone() {
var propDesc = BeanUtilsBean2.getInstance().getPropertyUtils().getPropertyDescriptors(this);
var allProps = Arrays.stream(propDesc)
.filter (prop -> !skippedProperties.contains(prop.getName())
.collect(Collectors.toList());
var countNotNull = allProps.stream().filter(prop -> {
try {
return BeanUtilsBean2.getInstance().getProperty(this, prop.getName()) != null;
} catch (Exception e) {
return false;
}
}).count();
return (countNotNull * 100.0f) / (allProps.size() - skippedProperties.size());
}

相关内容

  • 没有找到相关文章