DATAJPA-460 - Reduce implementation to core requested feature.

Removed the additional deleted flag in @Query as we currently already ship with a method to manually implement delete-queries (using @Modifying and a manually defined JPQL query).

Tiny optimization in DeleteExecution.

Original pull request: #66.
This commit is contained in:
Oliver Gierke
2014-03-31 14:35:42 +02:00
parent 99ae3c4567
commit 3ff4f94c68
7 changed files with 9 additions and 95 deletions

View File

@@ -64,12 +64,4 @@ public @interface Query {
* @return
*/
String countName() default "";
/**
* Returns whether the query should delete matching entities.
*
* @since 1.6
* @return
*/
boolean delete() default false;
}

View File

@@ -23,7 +23,6 @@ import javax.persistence.TypedQuery;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.query.JpaQueryExecution.CollectionExecution;
import org.springframework.data.jpa.repository.query.JpaQueryExecution.DeleteExecution;
import org.springframework.data.jpa.repository.query.JpaQueryExecution.ModifyingExecution;
import org.springframework.data.jpa.repository.query.JpaQueryExecution.PagedExecution;
import org.springframework.data.jpa.repository.query.JpaQueryExecution.SingleEntityExecution;
@@ -85,7 +84,6 @@ public abstract class AbstractJpaQuery implements RepositoryQuery {
* .lang.Object[])
*/
public Object execute(Object[] parameters) {
return doExecute(getExecution(), parameters);
}
@@ -95,15 +93,12 @@ public abstract class AbstractJpaQuery implements RepositoryQuery {
* @return
*/
private Object doExecute(JpaQueryExecution execution, Object[] values) {
return execution.execute(this, values);
}
protected JpaQueryExecution getExecution() {
if (method.isDeleteQuery()) {
return new DeleteExecution(em);
} else if (method.isCollectionQuery()) {
if (method.isCollectionQuery()) {
return new CollectionExecution();
} else if (method.isSliceQuery()) {
return new SlicedExecution(method.getParameters());

View File

@@ -229,6 +229,7 @@ public abstract class JpaQueryExecution {
* {@link Execution} removing entities matching the query.
*
* @author Thomas Darimont
* @author Oliver Gierke
* @since 1.6
*/
static class DeleteExecution extends JpaQueryExecution {
@@ -244,23 +245,16 @@ public abstract class JpaQueryExecution {
* @see org.springframework.data.jpa.repository.query.JpaQueryExecution#doExecute(org.springframework.data.jpa.repository.query.AbstractJpaQuery, java.lang.Object[])
*/
@Override
protected Object doExecute(AbstractJpaQuery query, Object[] values) {
protected Object doExecute(AbstractJpaQuery jpaQuery, Object[] values) {
Query qry = query.createQuery(values);
Query query = jpaQuery.createQuery(values);
List<?> resultList = query.getResultList();
List<?> resultList = qry.getResultList();
for (Object o : resultList) {
em.remove(o);
}
Object result = null;
if (query.getQueryMethod().isCollectionQuery()) {
result = resultList;
} else {
result = resultList.size();
}
return result;
return jpaQuery.getQueryMethod().isCollectionQuery() ? resultList : resultList.size();
}
}
}

View File

@@ -288,15 +288,4 @@ public class JpaQueryMethod extends QueryMethod {
public JpaParameters getParameters() {
return (JpaParameters) super.getParameters();
}
/**
* Return {@literal true} if this backing method is a query method with the {@link Query#delete()} attribute set to
* {@literal true} else {@literal false}.
*
* @return
* @since 1.6
*/
public boolean isDeleteQuery() {
return getAnnotationValue("delete", Boolean.class);
}
}

View File

@@ -70,7 +70,6 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
*/
@Override
public Query doCreateQuery(Object[] values) {
return query.createQuery(values);
}
@@ -81,7 +80,6 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
@Override
@SuppressWarnings("unchecked")
public TypedQuery<Long> doCreateCountQuery(Object[] values) {
return (TypedQuery<Long>) countQuery.createQuery(values);
}
@@ -91,12 +89,7 @@ public class PartTreeJpaQuery extends AbstractJpaQuery {
*/
@Override
protected JpaQueryExecution getExecution() {
if (this.tree.isDelete()) {
return new DeleteExecution(em);
}
return super.getExecution();
return this.tree.isDelete() ? new DeleteExecution(em) : super.getExecution();
}
/**

View File

@@ -1298,7 +1298,6 @@ public class UserRepositoryTests {
assertThat(result, hasItems(firstUser, secondUser));
}
/**
* @see DATAJPA-460
*/
@@ -1357,42 +1356,6 @@ public class UserRepositoryTests {
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,8 +317,8 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
* @see DATAJPA-496
*/
List<User> findByAttributesIn(Set<String> attributes);
/**
/**
* @see DATAJPA-460
*/
Long removeByLastname(String lastname);
@@ -327,16 +327,4 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
* @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);
}