使用JPA 2 TypedQuery进行更新

时间:2012-05-26 19:32:06

标签: 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 done = ? 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代替吗?

1 个答案:

答案 0 :(得分:1)

您应该执行此类操作的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