mkyong example ejemplo data spring spring-data spring-data-jpa

spring - example - Datos de primavera: ¿es compatible con "eliminar por"?



spring jpa repository example (4)

La derivación de las consultas de eliminación usando el nombre del método dado se admite a partir de la versión 1.6.0.RC1 de Spring Data JPA. Las palabras clave remove y delete son compatibles. Como valor de retorno, se puede elegir entre el número o una lista de entidades eliminadas.

Long removeByLastname(String lastname); List<User> deleteByLastname(String lastname);

Estoy usando Spring JPA para acceder a la base de datos. Puedo encontrar ejemplos como findByName y countByName, para los cuales no tengo que escribir ninguna implementación de método. Espero encontrar ejemplos para eliminar un grupo de registros basados ​​en alguna condición.

¿Spring JPA es compatible con deleteByName-like delete? Cualquier puntero es apreciado.

Saludos y gracias.


Si PartTreeJpaQuery un vistazo al código fuente de Spring Data JPA, y particularmente a la clase PartTreeJpaQuery , verás que se intenta crear PartTree instancia de PartTree . Dentro de esa clase, la siguiente expresión regular

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

debe indicar lo que está permitido y lo que no.

Por supuesto, si intentas agregar ese método, verás que no funciona y obtienes la pila completa.

Debo notar que estaba usando la versión 1.5.0.RELEASE de Spring Data JPA


Si va a utilizar los métodos de eliminación predefinidos proporcionados directamente por el JPA de primavera, a continuación, el marco aplicará dos consultas.

  • Primero recopile datos (como id y otra columna) utilizando ejecutar la consulta de selección con la cláusula delete query where.

  • luego de obtener resultSet de la primera consulta, se ejecutarán segundas consultas de eliminación para todas las identificaciones (una a una)

    Nota: Esta no es una forma optimizada para su aplicación porque muchas consultas se ejecutarán para una única consulta de eliminación MYSQL.

Esta es otra forma optimizada para eliminar el código de consulta porque solo se ejecutará una consulta de eliminación mediante el uso de los métodos personalizados a continuación.

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


Respuesta obsoleta (Spring Data JPA <= 1.6.x) :

@Modifying anotación al rescate. Sin embargo, deberá proporcionar su comportamiento de SQL personalizado.

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

Actualizar:

En las versiones modernas de Spring Data JPA (> = 1.7.x), se puede acceder a la derivación de consulta para delete , remove y count operaciones.

public interface UserRepository extends CrudRepository<User, Long> { Long countByFirstName(String firstName); @Transactional Long deleteByFirstName(String firstName); @Transactional List<User> removeByFirstName(String firstName); }