通过UPDATE更新实体关系.. SET查询

时间:2018-02-08 18:10:19

标签: java jpa eclipselink derby jpql

我有两个实体:

class A {
@OneToMany(mappedBy = "a")
List<B> bs;
// getter/ setter
}
class B {
@ManyToOne
A a;
// getter/ setter
}

要删除一个b,我首先需要使该关系无效。 &#34;传统&#34;我会做那样的事情:

A a = em.getReference(A.class, entityIdA)
B b = em.getReference(B.class, entityIdB);
a.getBs().remove(b);
b.setA(null);
em.remove(b);

如果a的列表越来越大(在我的情况下只有几百个),这不是很有效。

我知道我也可以使用JPQL来创建更新查询。

类似的东西:

Query q = em.createQuery("UPDATE B b SET b.a = NULL");
q.executeUpdate();

问题:b的{​​{1}列表中删除一个 a的相应JPQL查询是什么}} S'

简而言之: 如何翻译

b

进入JPQL查询?

编辑:上述更新查询转换为

a.getBs().remove(b);

表格如下:

UPDATE B SET A_ID = ? WHERE (ID = ?)
    bind => [null, 2]

1 个答案:

答案 0 :(得分:0)

从评论和this问题来看,改变关系的拥有方就足够了。

因此,要做

a.getBs().remove(b);

作为jpql查询,可以做

"UPDATE B b SET b.a = NULL"

这将释放ab之间的双向关系。

请注意,您可能需要清除L2缓存或关闭EntitiyManagerFactory才能使其生效。

factory.getCache().evictAll();