Tôi có một đối tượng JPA trong đó có một mối quan hệ nhiều-nhiều như thế này:Làm cách nào để sử dụng JPQL để xóa các mục nhập khỏi bảng tham gia?
@Entity
public class Role {
//...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="RolePrivilege",
joinColumns=
@JoinColumn(name="role", referencedColumnName="ID"),
inverseJoinColumns=
@JoinColumn(name="privilege", referencedColumnName="ID")
)
private Set<Privilege> privs;
}
Có không phải là một đối tượng JPA cho RolePrivilege, vì vậy tôi không chắc chắn làm thế nào để viết một truy vấn JPQL xóa các mục từ trường privs của một đối tượng role. Ví dụ, tôi đã thử điều này, nhưng nó không hoạt động. Nó phàn nàn rằng Role.privs không được ánh xạ.
DELETE FROM Role.privs p WHERE p.id=:privId
Tôi không chắc nên thử làm gì khác. Tôi có thể tất nhiên chỉ cần viết một truy vấn bản địa mà xóa từ bảng tham gia RolePrivilege. Tuy nhiên, tôi lo lắng rằng làm như vậy sẽ tương tác xấu với các đối tượng được lưu trong bộ nhớ cache cục bộ mà sẽ không được cập nhật bởi truy vấn gốc.
Thậm chí có thể viết JPQL để xóa mục nhập khỏi bảng tham gia như thế này không? Nếu không, tôi có thể tải tất cả các đối tượng Role và xóa các mục từ bộ sưu tập privs của từng đối tượng và sau đó tiếp tục tồn tại từng vai trò. Nhưng có vẻ ngớ ngẩn để làm điều đó nếu một truy vấn JPQL đơn giản sẽ làm tất cả cùng một lúc.