Весенние данные:" удалить по " поддерживается?
Я использую Spring JPA для доступа к базе данных. Я могу найти такие примеры, как findByName и countByName, для которых мне не нужно писать какую-либо реализацию метода. Я надеюсь найти примеры для удаления группы записей на основе некоторого условия.
поддерживает ли Spring JPA deleteByName-like delete? Любой указатель ценится.
с уважением и спасибо.
4 ответов:
устаревший ответ (Spring Data JPA :
@Modifyingаннотация к спасению. Однако вам нужно будет предоставить свое собственное поведение SQL.@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); }обновление:
в современных версиях Spring Data JPA (>=1.7.x) вывод запроса для
delete,removeиcountоперации доступны.public interface UserRepository extends CrudRepository<User, Long> { Long countByFirstName(String firstName); @Transactional Long deleteByFirstName(String firstName); @Transactional List<User> removeByFirstName(String firstName); }
вывод запросов на удаление с использованием заданного имени метода поддерживается начиная с версии 1.6.0.RC1 весенних данных JPA. Ключевые слова
removeиdeleteподдерживаются. В качестве возвращаемого значения можно выбрать число или список удаленных подразделений.Long removeByLastname(String lastname); List<User> deleteByLastname(String lastname);
если вы посмотрите на исходный код Spring Data JPA, и особенно
PartTreeJpaQueryкласс, вы увидите, что это пытается инстанцироватьPartTree. Внутри этого класса, следующее регулярное выражение
private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\p{Lu}.*?)??By")должно указывать, что разрешено, а что нет.
конечно, если вы попытаетесь добавить такой метод, вы на самом деле увидите, что это не работает, и вы получите полный stacktrace.
Я должен отметить, что я использовал, глядя на версия
1.5.0.RELEASEвесенних данных JPA
Если вы будете использовать предварительно определенные методы удаления, как это непосредственно предусмотрено spring JPA, то ниже два запроса будут выполняться платформой.
сначала собрать данные(например, идентификатор и другие колонки) с помощью выполнения запроса на выборку с помощью запроса на удаление предложении 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); }
Comments