Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JPA2 TypedQuery进行更新_Java_Jpa 2.0 - Fatal编程技术网

Java 使用JPA2 TypedQuery进行更新

Java 使用JPA2 TypedQuery进行更新,java,jpa-2.0,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.Temp

假设一个简单的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;
}
如何使用JPA2
TypedQuery
CriteriaQuery
和元模型来执行与简单的
更新任务集done=”等效的操作?其中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);
日期d;
CriteriaQuery cq=cb.createQuery(Task.class);
...
TypedQuery tq=em.createQuery(cq);
List tasks=tq.getResultList();
for(任务:任务){
任务完成(d);
em.merge(任务);
}
//或
Task Task=tq.getSingleResult();
任务完成(d);
em.merge(任务);

请参阅此以获取进一步参考。

执行此操作的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);
日期d;
CriteriaQuery cq=cb.createQuery(Task.class);
...
TypedQuery tq=em.createQuery(cq);
List tasks=tq.getResultList();
for(任务:任务){
任务完成(d);
em.merge(任务);
}
//或
Task Task=tq.getSingleResult();
任务完成(d);
em.merge(任务);

更多参考请参见此部分。

谢谢您的回答。我对这种方法的担忧是,它似乎会导致重复的读-修改-写周期,而简单的SQL update语句将允许DB进行更新,而无需将所有受影响的行传输到客户端并返回到DB。根据受影响行的数量,这可能会产生很大的差异。或者JPA层能够优化RMW循环吗?我理解您的担忧,我认为,对于额外的客户机-服务器往返,您是对的。但是,您可以处理许多优化。例如,请参见此链接:谢谢您的回答。我对这种方法的担忧是,它似乎会导致重复的读-修改-写周期,而简单的SQL update语句将允许DB进行更新,而无需将所有受影响的行传输到客户端并返回到DB。根据受影响行的数量,这可能会产生很大的差异。或者JPA层能够优化RMW循环吗?我理解您的担忧,我认为,对于额外的客户机-服务器往返,您是对的。但是,您可以处理许多优化。例如,请参见此链接: