본문 바로가기

Java/JPA

[JPA] List<Entity> 비교

 

* 자바 List 비교 참고

https://phyho.tistory.com/317

 

[JS] 배열값 비교 (include, '===') / Java_List 비교

* 배열요소 비교 ( include ) const arr = [1, 2, 3, 4, 5];console.log(arr.includes(2)); // true * includes() 함수는 내부적으로 '===' 연산자를 사용하여 요소를 비교하기 때문에 다른 타입은 비교 불가능.const mixedArr =

phyho.tistory.com

 


[ Entity 클래스 ]


@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Entity {

    private String id;
    private String name;
    private String code;

}

 

[ 서비스 로직 ]

// param => List<String> prevList, List<String> newList
//	 => List<Entity> prevInfo, List<Entity> saveInfo 


    // 삭제할 값이 있는 경우
    if(!prevList.equals(newList)) {
        prevInfo.removeAll(saveInfo);
        entityRepository.deleteAll(prevInfo);
    }

=> List<String> 의 비교는 순서까지 같아야한다 **

=> List<Entity> 에서 removeAll() 을 사용하게 되면 각 요소들을 equals() 메소드로 비교.

 

 따라서 Entity클래스에 equals() / hashCode() 메소드를 오버라이딩해 어떤 엔티티를 동등하다고 판단할지 재정의 필요. 

 ( IntelliJ 플러그인으로 자동생성 가능_ 엔티티의 식별자(id)를 기준으로 잡는다 )

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Entity {

    private String id;
    private String name;
    private String code;


    // equals method
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;			// 객체동등비교
        if (!(o instanceof Entity)) return false;	// 타입비교
        Entity entity = (Entity) o;
        return Objects.equals(id, entity.id) &&		// id비교
               Objects.equals(code, entity.code);	// code비교
    }

    // hashCode method
    @Override
    public int hashCode() {
        return Objects.hash(id, code);
    }

}

=>  id와 code가 같다면 동일한 엔티티로 간주.