Spring Data JPA查询未软删除登录用户订单启动报错如何解决
问题修复方案
错误根因
- 错误1:查询方法错误添加了
@Modifying注解:@Modifying注解仅用于数据变更类操作(增、删、改),查询方法添加该注解会触发JPA的校验逻辑异常。 - 错误2:HQL关联语法错误:HQL是面向实体对象的查询语言,不能直接像原生SQL一样关联数据库表名,
JourneyFoodOrder实体已经声明了@ManyToOne的user关联属性,直接通过该属性关联即可,无需手动写ON关联条件。 - 错误3:查询返回值不匹配:原SQL仅查询了部分字段,但是方法返回值声明为
List<JourneyFoodOrder>,JPA无法自动将零散字段封装为实体对象。 - 错误4:参数绑定不一致:
updateIsRemoved方法中@Param声明的参数名为orderId,但@Query中使用的参数占位符为:id,参数名不匹配会导致绑定失败。
修复后的代码
1. 修复JourneyFoodOrderRepository.java
@Repository public interface JourneyFoodOrderRepository extends JpaRepository<JourneyFoodOrder, Long>{ @Override void delete(JourneyFoodOrder order); @Modifying @Query("update JourneyFoodOrder j set j.isRemoved =true where j.orderId =:orderId") void updateIsRemoved(@Param("orderId")Long orderId); List<JourneyFoodOrder> findByIsRemoved(boolean isRemoved); // 去掉@Modifying,修正HQL语法,直接查询整个实体对象 @Query("SELECT j from JourneyFoodOrder j WHERE j.user.userId =:userId AND j.isRemoved=:isRemoved") List<JourneyFoodOrder> findOrderByUserIdAndNotDisabled(@Param("userId") long userId, @Param("isRemoved") boolean isRemoved); }
扩展说明
如果确实只需要查询指定字段,不需要返回完整实体,可以使用接口投影接收返回结果,示例如下:
// 定义投影接口 public interface OrderProjection { Long getOrderId(); Integer getHeadCount(); Date getDateOfDeparture(); Date getDateOfOrderPlaced(); Date getMealRetrievalTime(); Integer getAchar(); Integer getBread(); Integer getJam(); Integer getPuri(); Integer getThepla(); Integer getRoti(); Integer getOthers(); } // 仓库方法返回投影列表 @Query("SELECT j.orderId as orderId,j.headCount as headCount,j.dateOfDeparture as dateOfDeparture,j.dateOfOrderPlaced as dateOfOrderPlaced,j.mealRetrievalTime as mealRetrievalTime,j.achar as achar,j.bread as bread,j.jam as jam,j.puri as puri,j.thepla as thepla,j.roti as roti,j.others as others from JourneyFoodOrder j WHERE j.user.userId =:userId AND j.isRemoved=:isRemoved") List<OrderProjection> findOrderByUserIdAndNotDisabled(@Param("userId") long userId, @Param("isRemoved") boolean isRemoved);
内容的提问来源于stack exchange,提问作者SHIVAM MISHRA
相关产品推荐
相关产品推荐

