DATAJPA-460 - Support query creation for deleteBy / removeBy prefix.

Added implementation of deleteBy / removeBy support for JPA backed repositories. We delete entities by looking them up with the appropriate query and delete them afterwards via entityManager.remove(...). This is rather inefficient but provides the benefit of being able to use the query derivation mechanism for entity deletion as well.

Original pull request: #66.
This commit is contained in:
Thomas Darimont
2014-03-12 18:59:22 +01:00
committed by Oliver Gierke
parent dd64fe21ea
commit 99ae3c4567
7 changed files with 198 additions and 2 deletions

View File

@@ -1298,6 +1298,101 @@ public class UserRepositoryTests {
assertThat(result, hasItems(firstUser, secondUser));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByShouldReturnListOfDeletedElementsWhenRetunTypeIsCollectionLike() {
flushTestUsers();
List<User> result = repository.deleteByLastname(firstUser.getLastname());
assertThat(result, hasItem(firstUser));
assertThat(result, hasSize(1));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByShouldRemoveElementsMatchingDerivedQuery() {
flushTestUsers();
repository.deleteByLastname(firstUser.getLastname());
assertThat(repository.countByLastname(firstUser.getLastname()), is(0L));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByShouldReturnNumberOfEntitiesRemovedIfReturnTypeIsLong() {
flushTestUsers();
assertThat(repository.removeByLastname(firstUser.getLastname()), is(1L));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByShouldReturnZeroInCaseNoEntityHasBeenRemovedAndReturnTypeIsNumber() {
flushTestUsers();
assertThat(repository.removeByLastname("bubu"), is(0L));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByShouldReturnEmptyListInCaseNoEntityHasBeenRemovedAndReturnTypeIsCollectionLike() {
flushTestUsers();
assertThat(repository.deleteByLastname("dorfuaeB"), empty());
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByUsingAnnotatedQueryShouldReturnListOfDeletedElementsWhenRetunTypeIsCollectionLike() {
flushTestUsers();
List<User> result = repository.deleteByLastnameUsingAnnotatedQuery(firstUser.getLastname());
assertThat(result, hasItem(firstUser));
assertThat(result, hasSize(1));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByUsingAnnotatedQueryShouldRemoveElementsMatchingDerivedQuery() {
flushTestUsers();
repository.removeByLastnameUsingAnnotatedQuery(firstUser.getLastname());
assertThat(repository.countByLastname(firstUser.getLastname()), is(0L));
}
/**
* @see DATAJPA-460
*/
@Test
public void deleteByUsingAnnotatedQueryShouldReturnNumberOfDocumentsRemovedIfReturnTypeIsLong() {
flushTestUsers();
assertThat(repository.removeByLastnameUsingAnnotatedQuery(firstUser.getLastname()), is(1L));
}
private Page<User> executeSpecWithSort(Sort sort) {
flushTestUsers();

View File

@@ -317,4 +317,26 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
* @see DATAJPA-496
*/
List<User> findByAttributesIn(Set<String> attributes);
/**
* @see DATAJPA-460
*/
Long removeByLastname(String lastname);
/**
* @see DATAJPA-460
*/
List<User> deleteByLastname(String lastname);
/**
* @see DATAJPA-460
*/
@Query(value = "select u from User u where u.lastname = ?1", delete = true)
List<User> deleteByLastnameUsingAnnotatedQuery(String lastname);
/**
* @see DATAJPA-460
*/
@Query(value = "select u from User u where u.lastname = ?1", delete = true)
Long removeByLastnameUsingAnnotatedQuery(String lastname);
}