我使用Spring JPA进行数据库访问。我能够找到像findByName和countByName这样的例子,我没有必要编写任何方法实现。我希望找到基于某些条件删除一组记录的例子。
Spring JPA是否支持deleteByName-like delete?任何指针都很受欢迎。
问候并感谢。
答案 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)中,可以访问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 :(得分:65)
从Spring Data JPA的版本1.6.0.RC1开始,支持使用给定方法名称派生删除查询。我们支持关键字remove
和delete
。作为返回值,可以在数字或已删除实体列表之间进行选择。
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
但是,第一个选项(自定义查询)
这只是一个查询 它将删除该值存在的任何地方。
答案 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);