我正在使用Spring JPA进行数据库访问。我能够找到诸如findByName和countByName之类的示例,对于这些示例,我不必编写任何方法实现。我希望找到根据某些条件删除一组记录的示例。
Spring JPA是否支持像deleteByName一样的删除操作?非常感谢任何指导。
此致敬礼。
我正在使用Spring JPA进行数据库访问。我能够找到诸如findByName和countByName之类的示例,对于这些示例,我不必编写任何方法实现。我希望找到根据某些条件删除一组记录的示例。
Spring JPA是否支持像deleteByName一样的删除操作?非常感谢任何指导。
此致敬礼。
已废弃的答案(Spring Data JPA <=1.6.x):
@Modifying
注解来帮助你。不过你需要提供自定义的SQL行为。
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@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);
Long deleteByFirstName(String firstName);
List<User> removeByFirstName(String firstName);
}
DELETE FROM x WHERE id = ?1 or parent_id = ?1
来解决这个问题。顺便问一下,你确定 parent__id
没有打错吗(你是有意使用双下划线的吗)?不过,你为什么要使用本地查询选项呢? - Andrey Atapin从Spring Data JPA版本1.6.0.RC1开始,支持使用给定的方法名称来导出删除查询。关键字remove
和delete
均被支持。作为返回值,可以选择已移除实体的数量或列表。
Long removeByLastname(String lastname);
List<User> deleteByLastname(String lastname);
2种方法:
第一种:自定义查询
@Modifying
@Query("delete from User where firstName = :firstName")
void deleteUsersByFirstName(@Param("firstName") String firstName);
第二个 JPA 方法查询
List<User> deleteByLastname(String lastname);
当您使用第二种方法进行查询时,它将首先执行一个GET调用。
select * from user where last_name = :firstName
接下来它将把它加载到一个列表中 然后逐个调用删除ID
delete from user where id = 18
delete from user where id = 19
首先获取对象列表,然后通过循环一个个删除id。
但是,第一个选项(自定义查询),
只需要一个单独的查询语句 它将删除值存在的任何地方。
由于第二个选项会进行多个数据库查询,请尝试使用第一个选项。
PartTreeJpaQuery
类,您将看到它尝试实例化PartTree
。在该类中,以下正则表达式 private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")
应该指示了什么是允许的,什么是不允许的。1.5.0.RELEASE
。如果您将直接使用Spring JPA提供的预定义删除方法,则框架将执行以下两个查询。
首先,通过执行带有删除查询where子句的选择查询来收集数据(如id和其他列)。
然后,在获取第一个查询结果集之后,将为所有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);
}
是的,deleteBy方法得到支持。 要使用它,您需要在方法上注释@Transactional。
它正常工作
import org.springframework.transaction.annotation.Transactional;
@Transactional
Long removeAddressByCity(String city);
@Query(value = "delete from addresses u where u.ADDRESS_ID LIKE %:addressId%", nativeQuery = true)
void deleteAddressByAddressId(@Param("addressId") String addressId);
这是我的建议。你也可以使用原生查询,如下所示:
@Modifying
@Query(value="delete from rreo r where r.cod_ibge = ?1 and r.exercicio= ?2", nativeQuery = true)
void deleteByParameters(Integer codIbge, Integer exercicio);