Javaは2つの同一のエンティティクラスの属性値を比較します

2 つのエンティティの属性値を比較し、異なる属性名をキーとしてマップを返し、値をリストとして返し、それぞれ obj1 と obj2 の値を格納します。コードは次のとおりです。
パッケージ com.schdri.bimgis.disaster.domain.util;

インポート cn.hutool.core.util.ObjectUtil;
インポート org.springframework.stereotype.Component;
インポート java.beans.Introspector;
インポート java.beans.PropertyDescriptor;
インポート java. lang.reflect.Method; 
import java.math.BigDecimal; 
import java.sql.Timestamp; 
import java.util.*; 

@Component 
public class CompareFiledUtil { 
    
    /** 
     * 2 つのエンティティ属性値を比較し、マップを返します。相違点 属性名がキー、値がそれぞれobj1とobj2の値を格納するリスト
     * 
     * @param obj1 属性比較用のオブジェクト1 
     * @param obj2 属性比較用のオブジェクト2 
     * @paramignoreList どちらかを選択比較する必要のない属性名集合
     * @return 属性差分比較結果マップ
     */
    public static Map<String, List<Object>> CompareFields(Object obj1, Object obj2, List<String>ignoreList) { 
        try { 
            Map<String, List<Object>> map = new HashMap<String, List<Object>>( ); 
            // 同じ型の 2 つのオブジェクトのみを比較できます
            if (obj1.getClass() == obj2.getClass()) { 
                Class claz = obj1.getClass(); //
                オブジェクト [] の
                プロパティの説明 PropertyDescriptorを取得しますpds = Introspector.getBeanInfo(claz, Object.class).getPropertyDescriptors(); // 
                (PropertyDescriptor pd : pds) の
                すべてのプロパティを示します。 { 
                    // プロパティ名
                    String name = pd.getName();getName(); 
                    // 現在の属性が比較を無視することを選択した場合は、次のサイクルにスキップします
                    if (ignoreList != null &&ignoreList.contains(name)) { 
                        continue; 
                    } 
                    // メソッドを取得
                    Method readMethod = pd.getReadMethod(); // obj1 の get メソッドを呼び出すことは、obj1
                    オブジェクト o1
                    のプロパティ値を取得することと同等です。= readMethod .invoke(obj1); 
                    // obj2 の get メソッドを呼び出すことは、obj2
                    オブジェクトのプロパティ値を取得することと同じです o2 = readMethod.invoke(obj2); 
                    if (o1 instanceof Timestamp) { 
                        o1 = new Date((((タイムスタンプ) o1).getTime()); 
                    } 
                    if (o2 タイムスタンプのインスタンス) {
                        o2 = 新しい日付(((タイムスタンプ) o2).getTime()); 
                    if (o2 インスタンスof BigDecimal) { 
                        o2 = ((BigDecimal) o2).setScale(2, BigDecimal.ROUND_HALF_UP) 
                    ; 
                    if ((ObjectUtil.isEmpty(o1) || o1.equals("null")) && (ObjectUtil.isEmpty(o2) || o2.equals("null")) {
                    続行
                        ; 
                    } 
                    if (o1 == null && o2 != null) {
                        リスト list = new ArrayList(); 
                        list.add(o1); 
                        list.add(o2); 
                        map.put(名前, リスト);

                        続く; 
                    }
                    // これら 2 つの値が等しいかどうかを比較し、等しくない場合はマップに入れることができます
                    if (!o1.equals(o2)) { 
                        List list = new ArrayList(); 
                        list.add(o1 ); 
                        list.add(o2) ; 
                        map.put(name, list); 
                    } 
                } 
            } 
            return map; 
        } catch (Exception e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
}

返された構造体は、必要に応じて戻り値の型を変更できます。

おすすめ

転載: blog.csdn.net/m0_56324585/article/details/131794836