Данные Spring: поддерживается «delete by»?

Я использую Spring JPA для доступа к базе данных. Я могу найти такие примеры, как findByName и countByName, для которых мне не нужно писать какую-либо реализацию метода. Я надеюсь найти примеры для удаления группы записей на основе некоторых условий.

Поддерживает ли Spring JPA удаление deleteByName? Любой указатель оценивается.

С уважением и благодарностью.

Устаревший ответ (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); } 
  • Springboot / Angular2 - Как обрабатывать URL-адреса HTML5?
  • Как получить объект сеанса весной?
  • Инъекция Мокито издевается над весенним бобаном
  • Отключить безопасность для модульных тестов с весенней загрузкой
  • конфигурация страtagsи именования spring - hibernate 5
  • @Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?
  • Как избежать исключения «Circular view path» с использованием теста Spring MVC
  • Весенняя загрузка с помощью AngularJS html5Mode
  • Setter DI или Constructor DI весной?
  • Как установить заголовок «Принять:» в запросе Spring RestTemplate?
  • Исправления для проверки подлинности безопасности пружины с помощью @ExceptionHandler
  • Давайте будем гением компьютера.