Spring JPA - 更新多个字段的最佳方式

Han*_*ank 0 java spring hibernate jpa

我是新手使用JPA并尝试将我的代码从JdbcTemplate转换为JPA.最初我通过获取列的映射及其值来更新我的列的子集,并自己创建SQL Update字符串并使用DAO执行它.我想知道使用JPA做类似事情的最佳方法是什么?

编辑:
我如何将此代码从我的DAO转换为JPA中的等效代码?

public void updateFields(String userId, Map<String, String> fields) {
    StringBuilder sb = new StringBuilder();
    for (Entry<String, String> entry : fields.entrySet()) {
        sb.append(entry.getKey());
        sb.append("='");
        sb.append(StringEscapeUtils.escapeEcmaScript(entry.getValue()));
        sb.append("', ");
    }

    String str = sb.toString();
    if (str.length() > 2) {
        str = str.substring(0, str.length() - 2); // remove ", "
        String sql = "UPDATE users_table SET " + str + " WHERE user_id=?";
        jdbcTemplate.update(sql, new Object[] { userId },
                new int[] { Types.VARCHAR });
    }
}
Run Code Online (Sandbox Code Playgroud)

Mac*_*ski 5

你必须阅读更多关于JPA肯定:)

一旦实体进入,Persistence Context它就会被JPA提供程序跟踪,直到持久化上下文生命结束或者直到EntityManager#detach()调用方法为止.当事务完成(提交)时 - 持久化上下文中的托管实体的状态与数据库同步并进行所有更改.

如果您的实体是新的,您可以通过调用EntityManager#persist()方法将其放在persistece上下文中.

在您的情况下(更新现有实体),您必须从数据库中获取一行,并以某种方式将其更改为实体.它可以通过多种方式完成,但最简单的EntityManager#find()方法是调用返回被管实体的方法.返回的对象也将被置于当前的持久化上下文中,因此如果存在活动事务,您可以更改您喜欢的任何属性(而不是主键),并通过调用commit来完成事务(或者如果这是容器管理的事务,则只需完成方法).

更新

在您发表评论后,我可以看到您的观点.我认为您应该重新设计您的应用程序以符合JPA标准和功能.无论如何 - 如果你已经有成对的地图<Attribute_name, Attrbute_value>,你可以使用一些叫做的东西Metamodel.简单用法如下所示.这是天真的执行情况和仅适用于基本属性好,你应该照顾关系等.(获得更多的信息有关的属性可以通过方法来完成的attr.getJavaType()attr.getPersistentAttributeType())

Metamodel meta = entityManager.getMetamodel();
EntityType<User> user_ = meta.entity(User.class);

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaUpdate<User> update = cb.createCriteriaUpdate(User.class);

Root e = update.from(User.class);

for( Attribute<? super User, ?> attr : user_.getAttributes() ) {
      if (map.containsKey(attr.getName())) {
          update.set(attr, map.get(attr));
      }
}

update.where(cb.equal(e.get("id"), idOfUser));
entityManager.createQuery(update).executeUpdate();
Run Code Online (Sandbox Code Playgroud)

请注意,自2.1版以来,JPA中提供了更新标准查询.

在这里,您可以找到有关元模型生成的更多信息.

除了元模型之外,您还可以使用java反射机制.