在jpa中从多到多删除实体

在jpa中从多到多删除实体,jpa,spring-data,spring-data-jpa,hql,jpql,Jpa,Spring Data,Spring Data Jpa,Hql,Jpql,我有一个实体 @Entity @Table(name="user") public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private Long id; @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinTable(name

我有一个实体

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "friends")
    private Set<User> friends;
}
因为它没有效率,我想使用这个查询

public interface UserRepository extends PagingAndSortingRepository<User, Long>{
    void removeByUsernameAndFriendsUsername(String username, String otherUsername);
}
你知道可以用@NamedQuery或@Query删除它吗?我不需要先得到所有的朋友?类似于下面的查询

@Query(value = "delete from User U join U.friends friends where U.username = ?1 and friends.username = ?2")
这是注释实体

@Entity
@Table(name="comment")
public class Comment {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @NotNull
    @Size(min=1)
    @Column(name="text", nullable=false)
    private String text;

    @NotNull
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}
尝试:


我也遇到过同样的问题,我尝试使用本机sql,在delete语句中指定了联接表的名称。问题不在查询中。您有一个引用用户表的注释表,如stacktrace中所述,当您尝试删除用户时,您的引用正在中断。我怀疑这个问题是一个孤立的评论。后注释表too@Zeromus添加了注释实体。如果用户没有对注释的oneToMany引用,则显然会出现fk约束异常。您需要从用户到commentbtw的级联删除。默认情况下,FetchType在集合上是惰性的,在单个元素上是急切的,所以不必总是指定it@Modifying没有任何区别,因为查询本身不工作。无论如何,谢谢你。
@Query(value = "delete from User U join U.friends friends where U.username = ?1 and friends.username = ?2")
@Entity
@Table(name="comment")
public class Comment {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    private Long id;

    @NotNull
    @Size(min=1)
    @Column(name="text", nullable=false)
    private String text;

    @NotNull
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
}
 @Modifying
 @Query("delete from User U join U.friends friends where U.username = ?1 and friends.username = ?2)
....