2012-05-26 1 views
1

가정이 같은 간단한 JPA 엔티티 클래스 :업데이트를위한 JPA 2 TypedQuery를 사용

@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 TypedQuery, CriteriaQuery 및 메타 모델은 간단한 UPDATE TASK SET done = ? WHERE id = ? SQL 쿼리에 해당하는 작업을 수행 할 수 있습니까? 내가 인터넷에서 찾을 수있는 모든이가 대신 TypedQuery 함께 할 수있는이

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

같은 JPA를 사용 초래?

답변

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를 참조하십시오.

+1

답변 해 주셔서 감사합니다. 이 접근법에 대한 나의 관심은 반복 된 읽기 - 수정 - 쓰기 사이클이 발생하는 것처럼 보이고, 간단한 SQL 업데이트 문은 DB가 모든 영향을받는 행을 클라이언트로 전송하고 DB로 다시 보내지 않고 업데이트 할 수있게하는 것입니다. 영향을받는 행의 수에 따라 이것은 상당한 차이를 만들 수 있습니다. 아니면 RMW주기를 최적화 할 수있는 JPA 계층이 있습니까? – Waldheinz

+0

나는 귀하의 우려를 이해하고 있으며, 추가 클라이언트 - 서버 왕복 문제에 대해서는 귀하가 옳다고 생각합니다. 그러나 몇 가지 최적화를 처리 할 수 ​​있습니다. 예를 들어 다음 링크를 참조하십시오. http://java-persistence-performance.blogspot.com/2011/06/how-to-improve-jpa-performance-by-1825.html – perissf