ChatGPT解决这个技术问题 Extra ChatGPT

Spring Data: "delete by" is supported?

I am using Spring JPA for database access. I am able to find examples such as findByName and countByName, for which I dont have to write any method implementation. I am hoping to find examples for delete a group of records based on some condition.

Does Spring JPA support deleteByName-like delete? Any pointer is appreciated.

Regards and thanks.

Be carefull when you use derived query for batch delete. It isn't what you expect: DeleteExecution

A
Andrey Atapin

Deprecated answer (Spring Data JPA <=1.6.x):

@Modifying annotation to the rescue. You will need to provide your custom SQL behaviour though.

public interface UserRepository extends JpaRepository<User, Long> {
    @Modifying
    @Query("delete from User u where u.firstName = ?1")
    void deleteUsersByFirstName(String firstName);
}

Update:

In modern versions of Spring Data JPA (>=1.7.x) query derivation for delete, remove and count operations is accessible.

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    Long deleteByFirstName(String firstName);

    List<User> removeByFirstName(String firstName);

}

@AndreyAtapin Downvote because it is no longer a good answer. Maybe delete it ? One of stackoverflows flaws is handling version changes / bugfixes associated with libraries in question.
@webgeek, I used to solve this issue with DELETE FROM x WHERE id = ?1 or parent_id = ?1 . Btw, make sure that you don't have a type in parent__id (do you have double low dash by intention?). Why do you use a native query option though?
Even I use 1.7.4, @Transactional annotation is needed above of the query method to have successful deletion
Typically, in an application, you will have @ Service classes/methods and those will be calling the Repositories. And @ Service public methods should be the methods that are marked @ Transactional because transactions are Use Case based. Meaning a use case needs to fully commit or rollback. Not each individual Repository methods. So PLEASE PLEASE do NOT use @ Transactional on Repository methods. But on the Service methods that use the repository.
Making @Transactional at repo means inside service if you call repo multiple time each one will have diff transaction, so rollback within 1 query. If you provide at service level, your whole function will be rolllback on any error.
C
Christoph Strobl

Derivation of delete queries using given method name is supported starting with version 1.6.0.RC1 of Spring Data JPA. The keywords remove and delete are supported. As return value one can choose between the number or a list of removed entities.

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

S
Satish Patro

2 ways:-

1st one Custom Query

@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);

2nd one JPA Query by method

List<User> deleteByLastname(String lastname);

When you go with query by method (2nd way) it will first do a get call

select * from user where last_name = :firstName

Then it will load it in a List Then it will call delete id one by one

delete from user where id = 18
delete from user where id = 19

First fetch the list of object, then for loop to delete id one by one

But, the 1st option (custom query),

It's just a single query It will delete wherever the value exists.

Since in 2nd option it is making multiple DB query, try to use the first option.

Go through this link too https://www.baeldung.com/spring-data-jpa-deleteby


g
geoand

If you take a look at the source code of Spring Data JPA, and particularly the PartTreeJpaQuery class, you will see that is tries to instantiate PartTree. Inside that class the following regular expression

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

should indicate what is allowed and what's not.

Of course if you try to add such a method you will actually see that is does not work and you get the full stacktrace.

I should note that I was using looking at version 1.5.0.RELEASE of Spring Data JPA


S
Suneet Khurana

If you will use pre defined delete methods as directly provided by spring JPA then below two queries will be execute by the framework.

First collect data(like id and other column) using by execute select query with delete query where clause.

then after getting resultSet of first query, second delete queries will be execute for all id(one by one) Note : This is not optimized way for your application because many queries will be execute for single MYSQL delete query.

This is another optimized way for delete query code because only one delete query will execute by using below customized methods.



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


k
kyakya

It works just

import org.springframework.transaction.annotation.Transactional;

    @Transactional
    Long removeAddressByCity(String city);

a
amoljdv06

Yes , deleteBy method is supported To use it you need to annotate method with @Transactional


D
Digao

here follows my 2 cents. You can also use native queries, like:

@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);

i
iknow
@Query(value = "delete from addresses u where u.ADDRESS_ID LIKE %:addressId%", nativeQuery = true)
void deleteAddressByAddressId(@Param("addressId") String addressId);

Welcome to Stack Overflow. Before answering an old question having an accepted answer (look for the green ✓) as well as other answers ensure your answer adds something new or is otherwise helpful in relation to them. Also just posting code without any explanation isn't that helpful as it doesn't explain why or how it answers the question. Please include an explanation for your code to improve your post's quality. Please also refer to How do I write a good answer?.