You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:24:03