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:
committed by
Oliver Gierke
parent
dd64fe21ea
commit
99ae3c4567
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user