代码之家  ›  专栏  ›  技术社区  ›  kerner1000

通过更新更新实体关系。。设置查询

  •  0
  • kerner1000  · 技术社区  · 6 年前

    我有两个实体:

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

    要删除一个b,首先需要使该关系无效。 “传统上”我会这样做:

    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();
    

    问题: 要删除的相应JPQL查询是什么 b 从…起 的列表 b s

    简而言之: 如何翻译

    a.getBs().remove(b);
    

    进入JPQL查询?

    编辑: 提到的更新查询转换为

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

    表如下所示:

    A
    ID
    
    B
    ID    A_ID
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   kerner1000    6 年前

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

    因此,要做

    a.getBs().remove(b);
    

    作为jpql查询,您可以

    "UPDATE B b SET b.a = NULL"
    

    这将释放 a b .

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

    factory.getCache().evictAll();