我正在使用Spring Data JPA,我想封装一个执行特定SQL的方法。我在以下问题上做到了:
some_list[3] == 4
但是,我收到以下消息作为结果:
@Component
public interface UserRepository extends CrudRepository<User, String> {
@Query(
value = "delete from User u where u.alias = :alias",
nativeQuery = true
)
void deleteUserByAlias(@Param("alias") String alias);
}
那么问题出在哪里?
答案 0 :(得分:0)
您的课程应该是这样的:
@Component
public interface UserRepository extends CrudRepository<User, String> {
@Query(
value = "delete from User u where u.alias = :alias",
nativeQuery = true
)
@Modifying
void deleteUserByAlias(@Param("alias") String alias);
}
您会看到我正在使用@Modifying,有关更多信息,请查看此https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries
答案 1 :(得分:0)
没有直接回答我的问题,但是找到了一种解决方法,该方法可基于其他属性而非ID删除记录。
根据{{3}}的答复,
支持使用给定方法名称派生删除查询 从Spring Data JPA的1.6.0.RC1版本开始。关键字 支持删除和删除。作为返回值,可以选择 在编号或已删除实体的列表之间。
长removeByLastname(字符串姓氏);
列表deleteByLastname(String lastname);
我会写
@Transactional
void deleteByAlias(String alias);
在UserRepository
处达到目标。
我将不接受此答案,并希望进一步作出贡献。
答案 2 :(得分:0)
如果您的方法已经是Transactional,那么也请在存储库方法上使用transactional
@Component
public interface UserRepository extends CrudRepository<User, String> {
@Query(
value = "delete from User u where u.alias = :alias",
nativeQuery = true
)
@Modifying
@Transactional
void deleteUserByAlias(@Param("alias") String alias);
}
答案 3 :(得分:0)
@Repository
@Transactional
interface OrderRepository: JpaRepository<Order, OrderIdentity>{
@Query("SELECT * FROM orders WHERE id=:id",nativeQuery = true)
fun findBy(@Param("id") id: String): List<OrderEvent>
@Modifying
@Query("DELETE FROM orders WHERE id=:id", nativeQuery = true)
fun deleteFor(@Param("id") id: String)
}
通过在方法上使用@Modifying 和在 Repository 上使用@Transactional 错误将被解决。