背景说明:
业务背景,当我用JPA的时候发现,将网上的所有办法尝试,发现还是无法的将传入的null属性不更新,所以只能采取先用主键去数据库查一下,查完之后,再遍历所有null的属性将赋值为数据库的值。
在这里实体类用Test替代
示例:
可以使用Java反射和Optional来实现属性值的覆盖。以下是一个示例方法,它接受一个新的Test
对象和一个Optional<Test>
对象,如果新对象中的属性值为null,它将使用旧对象的值进行覆盖:
import java.lang.reflect.Field;
import java.util.Optional;
public static Test updateTestWithNonNullValues(Test newTest, Optional<Test> testOldOptional) {
if (testOldOptional.isPresent()) {
Test testOld = testOldOptional.get();
Class<?> clazz = newTest.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object newValue = field.get(newTest);
if (newValue == null) {
Object oldValue = field.get(testOld);
field.set(newTest, oldValue);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return newTest;
}
这个方法首先检查testOldOptional
是否存在,然后遍历newTest
对象的所有属性。对于每个属性,它检查新对象中的值是否为null。如果值为null,它将从旧对象中获取相应的值,并将其设置为新对象的属性值。
假设你的Test
类如下所示:
public class Test {
private String field1;
private Integer field2;
// ...constructor, getter and setter methods...
}
你可以像这样使用updateTestWithNonNullValues
方法:
Test oldTest = new Test("Old Value", 42);
Optional<Test> testOldOptional = Optional.of(oldTest);
Test newTest = new Test(null, null);
Test updatedTest = updateTestWithNonNullValues(newTest, testOldOptional);
System.out.println("Updated Test: Field1 = " + updatedTest.getField1() + ", Field2 = " + updatedTest.getField2());
这将输出:
Updated Test: Field1 = Old Value, Field2 = 42
这意味着新对象中的null值已被旧对象中的值替换。