【问题标题】:Spring deleteBy works only with @QuerySpring deleteBy 仅适用于 @Query
【发布时间】:2017-02-05 00:45:53
【问题描述】:

派生的 DeleteBy 查询不起作用。但是findBy 并使用@Query 删除有效。

我尝试添加@Modifying@Transactional,我将返回类型更改为LongList<OrderItem>void

这是我的 CrudRepository 接口,Order 和 OrderItem 类:

public interface OrderItemRepository extends CrudRepository<OrderItem, Long> {
    List<OrderItem> findByOrderAndItem_ItemGroup(Order order, ItemGroup itemGroup);

    @Transactional
    Long deleteByOrder(Order order);

    @Modifying
    @Query("delete from OrderItem o where o.order = ?1")
    Integer deleteByOrderQuery(Order order);
}

@Entity
@Table(name = "t_order_items")
public class OrderItem {
    @GeneratedValue
    @Id
    private Integer id;

    @Column(name="itemcount")
    private Integer itemCount;

    @OneToOne()
    @JoinColumn(name="item_id")
    private Item item;

    @ManyToOne
    @JoinColumn(name = "oder_id")
    private Order order;
}

@Entity
@Table(name = "t_orders")
public class Order implements Serializable {
    @GeneratedValue
    @Id
    private Integer id;

    @Column(name = "orderdate")
    private LocalDate orderDate;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, mappedBy = "order")
    private List<OrderItem> orderItems;
}

我已阅读文档http://docs.spring.io/spring-data/jpa/docs/current/reference/html/,但 deleteBy 并没有什么特别之处。

【问题讨论】:

  • 我读过这个,我提到我读过文档。我知道它必须起作用,但我不知道为什么它不起作用。
  • 请您具体说明您的情况是什么“OrderItem”和“Order”
  • 您的问题提示问题可能出在@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "order") private List&lt;OrderItem&gt; orderItems; 中,我发现了这个stackoverflow.com/a/32745045/3001523。所以如果我需要 CascadeType.ALL 我只能使用 @Query ?

标签: java spring spring-data spring-data-jpa


【解决方案1】:

问题出在CascadeType.ALL。 当我将其更改为 CascadeType.REMOVE 时,一切正常。 正确答案是:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.REMOVE, mappedBy = "order")
private List<OrderItem> orderItems;

【讨论】:

    【解决方案2】:

    在您提供的网址中可以阅读:

    public interface UserRepository extends CrudRepository<User, Long> {
    
      Long deleteByLastname(String lastname);
      List<User> removeByLastname(String lastname);
    }
    

    您的问题可能是方法的返回类型错误。 Delete 方法返回被删除项的 ID!

    代码可能是:

    public interface OrderItemRepository extends JpaRepository<OrderItem, Long> {
        List<OrderItem> findByOrderAndItem_ItemGroup(Order order, ItemGroup itemGroup);
    
        Long deleteByOrder(Order order);
    
        @Modifying
        @Query("delete from OrderItem o where o.order = ?1")
        Integer deleteByOrderQuery(Order order);
    }
    

    【讨论】:

    • 正如我所说,我将返回类型更改为LongList&lt;OrderItem&gt;void,但它不起作用。
    • 你为什么不用CrudRepository&lt;&gt;
    • @SlavaBabin 您能否为您的问题添加更多详细信息?您收到任何错误吗?你在 repo 中还有其他方法吗?
    • docs.spring.io/spring-data/jpa/docs/current/reference/html We also provide persistence technology-specific abstractions like e.g. JpaRepository or MongoRepository. Those interfaces extend CrudRepository and expose the capabilities of the underlying persistence technology in addition to the rather generic persistence technology-agnostic interfaces like e.g. CrudRepository. 中所说。但我确实尝试使用 CrudRepository,但没有任何改变。
    • 作为返回值,可以在数量或已删除实体列表之间进行选择。 stackoverflow.com/a/23731038/3001523
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2022-01-23
    • 2019-03-25
    • 1970-01-01
    • 2015-11-15
    • 2021-11-27
    • 2015-07-16
    相关资源
    最近更新 更多