在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)
....