2011-11-08 2 views
3

테이블 a에서 여러 행을 업데이트해야하며 for 루프를 사용하고 병합을 수행하여 객체 지향 접근 방식을 사용하는 것이 좋습니다.여러 행과 테이블을 업데이트하는 JPA

... 
// get list and assign columns to be updated 
... 
for (MyEntity e : entityList) { 
    em.merge(e); 
} 
.. 

이 방법을 사용하면 다른 테이블 (다른 속성 pf MyEntity)을 업데이트 할 수도 있습니다. 질문 중 하나에 이 게시 된 경우 updating multiple rows using JPA, 네임 쿼리를 사용하여 업데이트하는 두 번째 옵션이 더 빠를 것 같습니다. 그러나 여러 테이블을 일괄 적으로 업데이트해야하는 경우 업데이트가 어떻게 구현됩니까?

나는 시도했다 :

@NamedQuery(name="Agent.updateAccountStatusByTree", 
     query="UPDATE com.sample.core.data.Agent a " 
      + "INNER JOIN com.sample.core.data.Player p " 
      + "ON a.player.id = p.id " 
      + "SET a.accountStatus=:accountStatus, p.status=:accountStatus " 
      + "WHERE a.site.id=:siteId and a.agentTree like :agentTree")}) 

그러나 이것은 발생 :

org.hibernate.hql.ast.QuerySyntaxException: expecting "set", found 'INNER' 

내가 시도 또 다른 옵션은 다음과 같습니다

@NamedQuery(name="Agent.updateAccountStatusByTree", 
     query="update com.sample.core.data.Agent a " 
      + "set a.accountStatus=:accountStatus, a.player.status=:playerStatus " 
      + "where a.site.id=:siteId and a.agentTree like :agentTree")}) 

내가 이미 다른 참조가 있기 때문에 테이블, 그러나 이것은 SQL 문법 예외를 던지고 잘못된 쿼리를 생성 ... 거기에 이것을 달성하기 위해 다른 방법은 무엇입니까?

감사합니다.

답변

1

나는 그가 당신이 틀린 것을 경쟁하려고 생각합니다. 명명 된 쿼리는 JPQL (HQL) 쿼리 여야하지만 SQL 쿼리를 시도하는 것처럼 보입니다.

그래서 기본 쿼리를 사용하려면, 그럼 대신 @NamedNativeQuery을 사용해야합니다. 그렇지 않은 경우 쿼리를 JPQL (HQL)로 번역해야합니다.

* JPQL과 HQL의 차이점은 주석을 살펴보십시오.

Btw JPQL은 Hibernate 객체 관계형 매핑 라이브러리에 포함 된 이전의 비표준 쿼리 언어 인 HQL (Hibernate Query Language)을 기반으로합니다.

Hibernate와 HQL은 JPA 스펙보다 먼저 생성되었습니다. Hibernate 3에서 JPQL은 HQL의 부분 집합이다. (위키 백과) *

+0

@DataNucleus :이 질문은 최대 절전 모드에 대한 것입니다. Hibernate 지원 Hibernate는 최소한 Hibernate core 3.2 + Hibernate Annotation 3.3 이후로'@ NamedQuery'와'@ NamedNativeQuery'를 지원한다. 현재로서는 HQL은 방어 적이었지만 JPQL은 방어 적이 지 않았습니다. 그러나 이것은 오래 전이었습니다. 그래서 저는 제 대답을 약간 업데이트했습니다. – Ralph

+0

@DataNucleus : 왜 당신이 코멘트를 삭제 했나요? 적어도 좋은 코멘트였습니다. – Ralph

+0

죄송합니다. Ralph, 답장하는 데 너무 빠르다 .-- 나는 내 말을 바꿀 예정 이었지만, 그 때쯤에는 이미 답장을했고 또한 게시물을 훨씬 명확하게 만들었습니다. – DataNucleus

1

JPA 스펙 상태

update_clause ::= UPDATE entity_name [[AS] identification_variable] 
SET update_item {, update_item}* 
update_item ::= [identification_variable]{state_field | single_valued_object_field 

그래서 당신은 UPDATE 문에 가입 할 수 없다. JOIN을 사용하여 업데이트 할 수있는 유일한 방법은 SQL이며 모든 RDBMS가 같은 방식으로 JOIN을 지원하지 않기 때문에 데이터 저장소 독립성을 잃을 수 있습니다.

관련 문제