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