developer tip

SpringData : "delete by"가 지원됩니까?

copycodes 2020. 9. 2. 19:02
반응형

SpringData : "delete by"가 지원됩니까?


데이터베이스 액세스를 위해 Spring JPA를 사용하고 있습니다. 메서드 구현을 작성할 필요가없는 findByName 및 countByName과 같은 예제를 찾을 수 있습니다. 일부 조건에 따라 레코드 그룹을 삭제하는 예제를 찾고 싶습니다.

Spring JPA는 deleteByName과 같은 삭제를 지원합니까? 어떤 포인터라도 감사합니다.

감사합니다.


Deprecated answer (Spring Data JPA <= 1.6.x) :

@Modifying구조에 대한 주석. 하지만 사용자 지정 SQL 동작을 제공해야합니다.

@Transactional(readOnly = true)
public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Transactional
    @Query("delete from User u where u.firstName = ?1")
    void deleteUsersByFirstName(String firstName);
}

최신 정보:

현대 스프링 데이터 JPA (> = 1.7.x 이상)에 대한 쿼리 유도의 버전 delete, removecount작업에 액세스 할 수 있습니다.

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    @Transactional
    Long deleteByFirstName(String firstName);

    @Transactional
    List<User> removeByFirstName(String firstName);

}

지정된 메서드 이름을 사용한 삭제 쿼리 파생은 SpringData JPA 버전 1.6.0.RC1 부터 지원됩니다 . remove키워드 delete가 지원됩니다. 반환 값으로 제거 된 항목의 수 또는 목록 중에서 선택할 수 있습니다.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

SpringData JPA의 소스 코드, 특히 PartTreeJpaQuery클래스를 살펴보면 인스턴스화를 시도하는 것을 볼 수 PartTree있습니다. 해당 클래스 내에서 다음 정규식

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

허용되는 것과 허용되지 않는 것을 나타내야합니다.

물론 이러한 메서드를 추가하려고하면 실제로 작동하지 않고 전체 스택 트레이스를 얻을 수 있습니다.

1.5.0.RELEASESpringData JPA 버전 사용하고 있음을 유의해야합니다.


Spring JPA에서 직접 제공하는 미리 정의 된 삭제 메서드를 사용하는 경우 프레임 워크에서 아래의 두 쿼리가 실행됩니다.

  • 먼저 delete query where 절과 함께 select query를 실행하여 데이터 (ID 및 기타 컬럼 등)를 수집합니다.

  • 그런 다음 첫 번째 쿼리의 resultSet을 얻은 후 모든 ID에 대해 두 번째 삭제 쿼리가 실행됩니다 (하나씩)

    참고 : 단일 MYSQL 삭제 쿼리에 대해 많은 쿼리가 실행되기 때문에 이것은 응용 프로그램에 최적화 된 방법이 아닙니다.

이는 아래 사용자 정의 된 방법을 사용하여 하나의 삭제 쿼리 만 실행되기 때문에 쿼리 코드 삭제를위한 또 다른 최적화 된 방법입니다.



@NamedNativeQueries({

@NamedNativeQuery(name = "Abc.deleteByCreatedTimeBetween",
            query = "DELETE FROM abc WHERE create_time BETWEEN ?1 AND ?2")
    ,

    @NamedNativeQuery(name = "Abc.getByMaxId",
            query = "SELECT max(id) from abc")
})

@Entity
public class Abc implements Serializable {

}

@Repository
public interface AbcRepository extends CrudRepository {

    int getByMaxId();

    @Transactional
    @Modifying
    void deleteByCreatedTimeBetween(String startDate, String endDate);
}


일괄 삭제에 파생 쿼리를 사용할 때는주의하십시오. 예상 한 것이 아닙니다 : DeleteExecution

참고 URL : https://stackoverflow.com/questions/23723025/spring-data-delete-by-is-supported

반응형