Slava Babin
Slava Babin

Reputation: 728

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.

Upvotes: 3

Views: 4568

Answers (2)

Slava Babin
Slava Babin

Reputation: 728

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;

Upvotes: 1

xenteros
xenteros

Reputation: 15852

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

Upvotes: 0

Related Questions