Reputation: 728
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
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
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