Spring数据:"删除"支持?

时间:2014-05-18 14:31:06

标签: spring spring-data spring-data-jpa

我使用Spring JPA进行数据库访问。我能够找到像findByName和countByName这样的例子,我没有必要编写任何方法实现。我希望找到基于某些条件删除一组记录的例子。

Spring JPA是否支持deleteByName-like delete?任何指针都很受欢迎。

问候并感谢。

10 个答案:

答案 0 :(得分:167)

已弃用的答案(Spring Data 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);
}

更新

在现代版本的Spring Data JPA(&gt; = 1.7.x)中,可以访问deleteremovecount操作的查询派生。

public interface UserRepository extends CrudRepository<User, Long> {

    Long countByFirstName(String firstName);

    @Transactional
    Long deleteByFirstName(String firstName);

    @Transactional
    List<User> removeByFirstName(String firstName);

}

答案 1 :(得分:65)

从Spring Data JPA的版本1.6.0.RC1开始,支持使用给定方法名称派生删除查询。我们支持关键字removedelete。作为返回值,可以在数字或已删除实体列表之间进行选择。

Long removeByLastname(String lastname);

List<User> deleteByLastname(String lastname);

答案 2 :(得分:6)

如果您查看Spring Data JPA的源代码,特别是PartTreeJpaQuery类,您将看到尝试实例化PartTree。 在该类中包含以下正则表达式

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

应该表明允许的内容和不允许的内容。

当然,如果您尝试添加这样的方法,您实际上会看到它不起作用,您将获得完整的堆栈跟踪。

我应该注意到我正在使用查看Spring Data JPA的版本1.5.0.RELEASE

答案 3 :(得分:4)

2种方式:-

第一个自定义查询

[!] Error installing Alamofire
[!] /usr/bin/git clone https://github.com/Alamofire/Alamofire.git /var/folders/0f/tk8t38hn0pq_81glyqfgsp6m0000gn/T/d20191105-77916-ujlfnd --template= --single-branch --depth 1 --branch 4.9.1

Cloning into '/var/folders/0f/tk8t38hn0pq_81glyqfgsp6m0000gn/T/d20191105-77916-ujlfnd'...
error: RPC failed; HTTP 403 curl 22 The requested URL returned error: 403 Forbidden
fatal: the remote end hung up unexpectedly

第二种方法的JPA查询

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

当您通过方法(第二种方法)进行查询时,它将首先进行get调用

List<User> deleteByLastname(String lastname);

然后将其加载到列表中 然后它将一一调用删除ID

select * from user where last_name = :firstName

首先获取对象列表,然后进行循环以逐个删除id

但是,第一个选项(自定义查询)

这只是一个查询    它将删除该值存在的任何地方。

也通过此链接https://www.baeldung.com/spring-data-jpa-deleteby

答案 4 :(得分:1)

如果您将使用spring JPA直接提供的预定义删除方法,那么框架将执行以下两个查询。

  • 首先使用带有delete query where子句的执行选择查询来收集数据(如id和其他列)。

  • 然后在获得第一个查询的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);
}

答案 5 :(得分:0)

在使用派生查询进行批删除时要小心。 这不是您所期望的:DeleteExecution

答案 6 :(得分:0)

是,支持deleteBy方法 要使用它,您需要使用@Transactional

注释方法

答案 7 :(得分:0)

这里是我的2美分。您还可以使用本机查询,例如:

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

它只是有效

import org.springframework.transaction.annotation.Transactional;

    @Transactional
    Long removeAddressByCity(String city);