简体   繁体   中英

Spring deleteBy works only with @Query

Derived DeleteBy Query does not work. But findBy and delete with @Query works.

I tried to add @Modifying and @Transactional , i changed return type to Long , List<OrderItem> , void .

This is my CrudRepository interface, Order and OrderItem classes:

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

I have read the documentation http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ but there are nothing special about deleteBy.

The problem was in CascadeType.ALL . When i changed it to CascadeType.REMOVE everything worked out. The right answer is:

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

In the URL you have provided one can read:

public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);
  List<User> removeByLastname(String lastname);
}

Your problem might be, that you have wrong return type of the method. Delete method returns the ID of the removed item!

The code might be:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM