2012-03-11 2 views
0

하나의 업데이트 -HQL 쿼리를 exceute하는 문제가 있습니다.HQL 업데이트 쿼리

프로필 엔티티에 저장된 값을 편집하고 싶지만 행운이 없습니다.

@RequestMapping(value = "/profile", method = RequestMethod.POST) 
public String profilePost(ModelMap model, @ModelAttribute("user") UserEntity user) { 

    Session session = HibernateUtil.getSessionFactory().openSession(); 

session.beginTransaction(); 

Query query = session.createQuery("update UserEntity u set u.profile.firstName =  :firstName" 
        + " where u.username = :username"); 

query.setParameter("firstname", "john"); 
query.setParameter("username", user.getUsername()); 
int result = query.executeUpdate(); 

session.getTransaction().commit(); 

return "redirect:/login"; 
} 

당신은 나에게이 LOK 방법을 몇 가지 조언을 줄 수 :

내 실체는 컨트롤러에서

@Entity 
@Table(name = "users", catalog = "testdb") 
public class UserEntity implements java.io.Serializable { 

private Integer id; 
private String username; 
private String password; 
private Profile profile; 

@OneToOne(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL) 
public Profile getProfile() { 
    return this.profile; 
} 

public void setProfile(Profile profile) { 
    this.profile = profile; 
} 
} 

@Entity 
@Table(name = "profiles", catalog = "testdb") 
public class Profile implements java.io.Serializable { 
private Integer id; 
private UserEntity user; 
private String firstName; 
private String lastName; 

@OneToOne(fetch = FetchType.LAZY) 
@PrimaryKeyJoinColumn 
public UserEntity getUser() { 
    return this.user; 
} 

public void setUser(UserEntity user) { 
    this.user = user; 
} 
} 

내가 다음 업데이트 쿼리를 실행하려면 아래처럼 보인다 질문:)? the documentation에서

답변

2

:

단지에서-절에라는 하나의 개체가있을 수 있습니다. 그러나 에 별명을 지정할 수 있습니다. 엔티티 이름에 별명이 지정되어 있으면 어떤 별명 참조도 해당 별명을 사용하여 규정되어야합니다. 엔티티 이름이 별칭이 아닌 인 경우 모든 속성 참조가 수식으로 불법입니다.

벌크 HQL 쿼리에는 암시 적 또는 명시 적 조인을 지정할 수 없습니다. 하위 쿼리는 where-clause에서 사용할 수 있습니다. 여기에서 하위 쿼리 자체에는 조인이 포함될 수 있습니다.

최대 절전 모드와 같은 ORM 개념은 이러한 업데이트 쿼리를 피하는 것입니다. 당신은 세션으로부터 영속 엔티티를 얻고 그것을 수정하고, Hibernate는 투명하게 데이터베이스에 업데이트를 저장합니다 :

Query query = session.createQuery("select p from Profile p where p.user.username = :username"); 
Profile p = query.setString("username", user.getUsername()).uniqueResult(); 
p.setFirstName("john"); 
+1

고맙습니다! 당신은 내 하루를 :)) – user1199476