Java 使用JPA2 TypedQuery进行更新
假设一个简单的JPA实体类,如下所示: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
@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;
}
如何使用JPA2TypedQuery
、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循环吗?我理解您的担忧,我认为,对于额外的客户机-服务器往返,您是对的。但是,您可以处理许多优化。例如,请参见此链接: