Spring Данные: поддерживается "delete by"?
Я использую Spring JPA для доступа к базе данных. Я могу найти такие примеры, как findByName и countByName, для которых мне не нужно писать какую-либо реализацию метода. Я надеюсь найти примеры для удаления группы записей на основе некоторого условия.
Поддерживает ли Spring JPA deleteByName-delete? Любой указатель оценивается.
С уважением и благодарностью.
Ответы
Ответ 1
Устаревший ответ (Spring Данные JPA <= 1.6.x):
@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);
}
Update:
В современных версиях Spring вывод данных 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);
}
Ответ 2
Утверждение запросов на удаление с использованием имени данного метода поддерживается начиная с версии 1.6.0.RC1 Spring данных JPA. Поддерживаются ключевые слова remove
и delete
. В качестве возвращаемого значения можно выбрать между числом или списком удаленных объектов.
Long removeByLastname(String lastname);
List<User> deleteByLastname(String lastname);
Ответ 3
Если вы посмотрите на исходный код Spring Data JPA, и особенно класс PartTreeJpaQuery
, вы увидите, что пытается создать экземпляр PartTree
.
Внутри этого класса следующее регулярное выражение
private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")
должен указывать, что разрешено, а что нет.
Конечно, если вы попытаетесь добавить такой метод, вы увидите, что это не работает, и вы получите полную стек.
Следует отметить, что я использовал версию 1.5.0.RELEASE
для Spring Data JPA