java - 使用 JPA 2 TypedQuery 进行更新

标签 java jpa-2.0

假设有一个简单的 JPA 实体类,如下所示:

@Entity(name="TASK")
public class Task implements Serializable {
    /* getters/setters omitted for brevity */

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Date done;
}

如何使用 JPA 2 TypedQueryCriteriaQuery 和元模型来执行与简单的 UPDATE TASK SET did = 等效的操作? WHERE id = ? SQL 查询?我在网上找到的所有内容都会导致像这样使用 JPA

Query q = em.createQuery(
  "UPDATE TASK SET done = :date WHERE id = :id");
q.setParameter(/* set date and id */);
q.executeUpdate();

这可以用 TypedQuery 来完成吗?

最佳答案

您应该执行此类操作的 JPA 方式是让 CriteriaQuery 选择要修改的项目,并使用纯 Java 循环它们,然后使用 merge() 方法修改它们。像这样的东西:

Date d;
CriteriaQuery<Task> cq = cb.createQuery(Task.class);
...
TypedQuery<Task> tq = em.createQuery(cq);
List<Task> tasks = tq.getResultList();
for (Task task : tasks) {
    task.setDone(d);
    em.merge(task);
}
// or
Task task = tq.getSingleResult();
task.setDone(d);
em.merge(task);

查看此answer以供进一步引用。

关于java - 使用 JPA 2 TypedQuery 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10769164/

相关文章:

java - jackson 将数组反序列化为 java 对象

java - 对 JPA 2 标准查询进行分页

mysql - JPA(Hibernate、Mysql)在使用 setmaxresults 时获取计数

java - 是否有空空闲列表数据结构?

java - 无法解析最近格式化的 ZonedDateTime Java 8

java - JPA中的显式和隐式JOIN有什么区别? (表现)

mapping - OneToMany-联接表和外键之间有什么区别?

jpa - 在 jpa 条件 api 中使用 NOT EXISTS 构建查询

java - 在字符串模板电子邮件中格式化日期

java - 应该使用哪个 jsr-275 单位实现?