Данные Spring: поддерживается «delete by»?
Я использую Spring JPA для доступа к базе данных. Я могу найти такие примеры, как findByName и countByName, для которых мне не нужно писать какую-либо реализацию метода. Я надеюсь найти примеры для удаления группы записей на основе некоторых условий.
Поддерживает ли Spring JPA удаление deleteByName? Любой указатель оценивается.
С уважением и благодарностью.
- Spring + Web MVC: dispatcher-servlet.xml и applicationContext.xml (плюс общая безопасность)
- Как импортировать Java-config-class в XML-config, чтобы оба контекста имели компоненты?
- Каковы преимущества контейнеров для инъекций зависимостей?
- Невозможно Autowire @Repository аннотированный интерфейс в Spring Boot
- Как регистрировать HttpRequest и HttpResponse в файле?
- Весенние данные и исходный запрос с разбивкой на страницы
- получение исключения: не определен bean с именем «springSecurityFilterChain»
- Как java-настроить отдельные источники данных для весенних пакетных данных и бизнес-данных? Должен ли я это сделать?
- определить целевой URL на основе ролей в весенней безопасности 3.1
- Безопасность Springboot не работает
- Весенний язык выражений (SpEL) с @Value: доллар против hashа ($ против #)
- Можно ли настроить SpringMVC для обработки всех запросов, но исключить каталоги статического содержимого?
- Spring Autowiring class vs. interface?
Устаревший ответ (Spring Data JPA <= 1.6.x) :
@Modifying
annotations к спасению. Тем не менее, вам нужно будет предоставить свое пользовательское поведение SQL.
@Transactional(readOnly = true) public interface UserRepository extends JpaRepository { @Modifying @Transactional @Query("delete from User u where u.firstName = ?1") void deleteUsersByFirstName(String firstName); }
Обновить:
В современных версиях Spring Data JPA (> = 1.7.x) вывод запроса для операций delete
, remove
и count
доступен.
public interface UserRepository extends CrudRepository { Long countByFirstName(String firstName); @Transactional Long deleteByFirstName(String firstName); @Transactional List removeByFirstName(String firstName); }
Выделение запросов на удаление с использованием имени данного метода поддерживается начиная с версии 1.6.0.RC1 Spring Data JPA. Поддерживаются ключевые слова для remove
и delete
. В качестве возвращаемого значения можно выбрать между числом или списком удаленных объектов.
Long removeByLastname(String lastname); List deleteByLastname(String lastname);
Если вы посмотрите исходный код Spring Data JPA и, в частности, class PartTreeJpaQuery
, вы увидите, что пытается создать экземпляр PartTree
. Внутри этого classа следующее регулярное выражение
private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")
должен указывать, что разрешено, а что нет.
Конечно, если вы попытаетесь добавить такой метод, вы действительно увидите, что это не работает, и вы получите полную стек.
Я должен отметить, что я использовал просмотр версии 1.5.0.RELEASE
из Spring Data JPA
Если вы будете использовать предварительно определенные методы удаления, как напрямую, предоставленные весной JPA, то ниже два запроса будут выполняться инфраструктурой.
-
Сначала собирайте данные (например, id и другой столбец), используя запрос выполнения select с предложением delete where where.
-
то после получения resultSet первого запроса будут выполняться все запросы на удаление для всех id (один за другим)
Примечание. Это не оптимизировано для вашего приложения, потому что многие запросы будут выполняться для одного запроса на удаление MYSQL.
Это еще один оптимизированный способ удаления кода запроса, потому что только один запрос на удаление будет выполняться с использованием нижеописанных методов.
@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); }