gpt4 book ai didi

jpa - 如何使用 JPQL 从连接表中删除条目?

转载 作者:行者123 更新时间:2023-12-04 12:02:00 24 4
gpt4 key购买 nike

我有一个 JPA 对象,它具有这样的多对多关系:

@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;
}

RolePrivilege 没有 JPA 对象,所以我不确定如何编写 JPQL 查询以从角色对象的 privs 字段中删除条目。例如,我试过这个,但它不起作用。它提示 Role.privs 未映射。
DELETE FROM Role.privs p WHERE p.id=:privId

我不知道还有什么可以尝试的。我当然可以只编写一个从连接表 RolePrivilege 中删除的 native 查询。但是,我担心这样做会与 native 查询不会更新的本地缓存对象发生严重交互。

甚至可以编写 JPQL 来从这样的连接表中删除条目吗?如果没有,我可以加载所有 Role 对象并从每个角色的 privs 集合中删除条目,然后保留每个角色。但是,如果一个简单的 JPQL 查询可以一次性完成所有操作,那么这样做似乎很愚蠢。

最佳答案

JPQL 更新和删除语句需要引用实体名称,而不是表名称,因此我认为您对所建议的方法不走运。

根据您的 JPA 提供程序,您可以使用简单的原始 SQL 语句(应该是 100% 可移植的)从 JoinTable 中删除条目,然后以编程方式与缓存提供程序 API 交互以驱逐数据。例如,在 Hibernate 中,您可以调用 evict() 来使第二级缓存中的所有“Role.privs”集合过期:

sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs
sessionFactory.evictCollection("Role.privs"); //evict all privs collections

不幸的是,我对 JPA API 的使用不够,无法确定究竟支持什么。

关于jpa - 如何使用 JPQL 从连接表中删除条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1071940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com