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


99

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

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

감사합니다.

답변:


184

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

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

public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @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);

    Long deleteByFirstName(String firstName);

    List<User> removeByFirstName(String firstName);

}

2
더 이상 좋은 답변이 아니기 때문에 @AndreyAtapin Downvote. 삭제 하시겠습니까? 스택 오버플로 결함 중 하나는 문제의 라이브러리와 관련된 버전 변경 / 버그 수정을 처리하는 것입니다.
Ben George

1
@webgeek,이 문제를 DELETE FROM x WHERE id = ?1 or parent_id = ?1. Btw, 유형이 없는지 확인하십시오 parent__id(의도에 따라 이중 낮은 대시가 있습니까?). 왜 네이티브 쿼리 옵션을 사용합니까?
Andrey Atapin 2015 년

4
1.7.4를 사용해도 성공적으로 삭제하려면 쿼리 메서드 위에 @Transactional 주석이 필요합니다.
gokhansari

40
일반적으로 응용 프로그램에는 @ 서비스 클래스 / 메서드가 있으며 리포지토리를 호출합니다. 그리고 @ Service 공용 메서드는 트랜잭션이 Use Case 기반이므로 @ Transactional로 표시된 메서드 여야합니다. 유스 케이스는 완전히 커밋하거나 롤백해야 함을 의미합니다. 각각의 개별 리포지토리 메서드는 아닙니다. 따라서 Repository 메서드에서 @ Transactional을 사용하지 마십시오. 그러나 저장소를 사용하는 서비스 방법에 대해서는.
user1567291 17:52에

1
repo에서 @Transactional을 만드는 것은 repo를 여러 번 호출하면 각기 다른 트랜잭션이 있으므로 1 쿼리 내에서 롤백한다는 의미입니다. 서비스 수준에서 제공하는 경우 오류가 발생하면 전체 기능이 롤백됩니다.
P Satish Patro

78

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

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

7

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 버전 을 사용하고 있음을 유의해야합니다.


6

2 가지 방법 :-

첫 번째 맞춤 검색어

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);

메소드 별 두 번째 JPA 쿼리

List<User> deleteByLastname(String lastname);

메서드 별 쿼리 (두 번째 방법)를 사용하면 먼저 get 호출을 수행합니다.

select * from user where last_name = :firstName

그런 다음 목록에로드 한 다음 삭제 ID를 하나씩 호출합니다.

delete from user where id = 18
delete from user where id = 19

먼저 객체 목록을 가져온 다음 for 루프를 사용하여 ID를 하나씩 삭제합니다.

하지만 첫 번째 옵션 (사용자 정의 쿼리)은

그것은 단지 하나의 쿼리 일뿐입니다. 값이 존재하는 모든 곳에서 삭제됩니다.

이 링크도 통과하십시오 https://www.baeldung.com/spring-data-jpa-deleteby


1
정보 주셔서 감사합니다!
curious1

2

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);
}

1

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


안녕하세요. RBAR (고통스러운 행)을 지적하는 경우 답변에 추가 할 수 있습니까? (그리고 나는 찬성 할 것입니다). 나는 당신이 여기서 무엇을 지적하고 있는지 추측하고 있습니다.
granadaCoder

0

예, deleteBy 메서드가 지원됩니다. 사용하려면 @Transactional로 메서드에 주석을 달아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.