gpt4 book ai didi

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

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

我刚开始使用 JPA,并尝试将我的代码从 JdbcTemplate 转换为 JPA。最初,我通过获取列及其值的映射来更新列的子集,并自己创建 SQL 更新字符串并使用 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 });
}
}

最佳答案

您必须阅读有关 JPA 的更多信息当然:)

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

如果您的实体是新的,您可以通过调用 EntityManager#persist() 将其放入持久化上下文中。方法。

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

更新

听完你的评论,我明白了你的观点。我认为您应该重新设计您的应用程序以适应 JPA 标准和功能。不管怎样 - 如果你已经有一张成对的 map <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();

请注意,自 2.1 版本起,JPA 中提供了更新条件查询。

Here您可以找到有关元模型生成的更多信息。

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

关于java - Spring JPA - 更新多个字段的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24717292/

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