Spring deleteBy仅适用于@Query

时间:2016-09-27 11:41:05

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

派生的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没有什么特别之处。

2 个答案:

答案 0 :(得分:1)

问题出在CascadeType.ALL。 当我把它改为CascadeType.REMOVE时,一切都解决了。 正确的答案是:

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

答案 1 :(得分:0)

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

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);
}