HQL更新查询

时间:2012-03-11 17:09:05

标签: hql

我遇到了一个更新-HQL查询的问题。

我想编辑保存在个人资料实体中的值,但没有运气。

我的实体如下所示

@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;
}
}

在控制器中我想执行以下更新查询:

@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";
}

你能给我一些建议,应该如何解决这个问题:)?

1 个答案:

答案 0 :(得分:2)

来自the documentation

  

在from子句中只能命名一个实体。它可以,   但是,别名。如果实体名称是别名,则为任何属性   必须使用该别名限定引用。如果实体名称是   没有别名,那么任何属性引用都是非法的   合格。

     

可以在批量HQL中指定隐式或显式的连接   查询。子查询可以在where子句中使用,其中   子查询本身可能包含连接。

像Hibernate这样的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");