派生的DeleteBy查询不起作用。但findBy
和@Query
删除有效。
我尝试添加@Modifying
和@Transactional
,我将返回类型更改为Long
,List<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没有什么特别之处。
答案 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);
}