【问题标题】:How to update two tables using jpa with java?java - 如何使用jpa和java更新两个表?
【发布时间】:2020-07-10 04:14:38
【问题描述】:

我的服务必须更新两个名为 AjustesValores

的表

我有我的下一节课,我得到了我想要更新的 2 个参数

public class ClasePruebaImpl{
     @Setter
     private PruebaOperacion pruebaOperacion;
     
     public void actualizar(final ClaseEntrada){
     
        pruebaOperacion.operacionActualizar(claseEntrada.getComponente(), claseEntrada.getModulo());
     }
     
}

以及更新逻辑应该执行的类,其中AjustesValores是Entity类,已经映射了但是不知道怎么映射更新

有人帮我怎么做, 我应该使用哪些方法?

@Stateless
@LocalBean
public class PruebaOperacion{

 @PersistenceContext(unitName = "USER_PU")
  private EntityManager entityManager;
 
  @Interceptors(CheckpointMonitor.class)
  public void operacionActualizar(Integer componente, Integer modulo){
  
    //Entidades
    final Ajustes ajustes = new Ajustes();
    final Valores valores = new Valores();
  
  }
 
}

这是一个关于我如何实现更新的查询

UPDATE USER_PU.AJUSTES SET VALOR = 'Nuevo valoe 99'
WHERE TIPO = 'NEW' AND LLAVE= 'PRUEBA_COMPONENTE_A';

UPDATE USER_PU.VALORES SET VALOR= '99'
WHERE ID_AJUSTE = (SELECT ID_AJUSTE FROM USER_PU.AJUSTES WHERE TIPO = 'NEW' AND LLAVE = 'PRUEBA_COMPONENTE_A');

【问题讨论】:

    标签: java hibernate jpa persistence


    【解决方案1】:

    有三种方法,最简单的方法是使用@NamtiveQuery,但在我看来最糟糕的方法是因为它违反了 JPA 理念,第二种方法是实体管理器获取和更新实体,第三种方法是批量处理操作。

    1.- 原生查询

    Query q1= entityManager.createNativeQuery(
                    " UPDATE USER_PU.AJUSTES SET VALOR = :nuevoValor1"+ 
                    " WHERE TIPO = :tipo1 AND LLAVE= :llave1;");
    
    q1.setParameter("nuevoValor1", "Nuevo valoe 99");
    q1.setParameter("tipo1", "NEW");
    q1.setParameter("llave1", "PRUEBA_COMPONENTE_A");
    q1.executeUpdate();
    

    2.- 查找对象并更新

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Ajustes> cq = cb.createQuery(Ajustes.class);
    Root<Ajustes> rootAjustes = cq.from(Ajustes.class);
    
    cq.where(
        cb.and(cb.equal(rootAjustes.get(Ajustes_.tipo),"NEW"),
            cb.equal(rootAjustes.get(Ajustes_.llave),"PRUEBA_COMPONENTE_A")));
    
    //BBDD entity
    Ajustes resultado = em.createQuery(cq).getSingleResult();
    //Update fields
    resultado.setValor("nuevoValor1");
    //Persist changes
    entityManager.merge(resultado);
    

    3.- 批量操作(JPA 2.1 中的新功能)

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaUpdate<Ajustes> cu = cb.createCriteriaUpdate(Ajustes.class);
    Root<Ajustes> rootAjustes = cu.from(Ajustes.class);
    
    cu.set(rootAjustes.get(Ajustes_.valor), "Nuevo valoe 99");
    
    cu.where(
        cb.and(cb.equal(rootAjustes.get(Ajustes_.tipo),"NEW"),
            cb.equal(rootAjustes.get(Ajustes_.llave),"PRUEBA_COMPONENTE_A")));
    
    return entityManager.createQuery(cu).executeUpdate();
    

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2019-09-09
      相关资源
      最近更新 更多