我遇到了一个更新-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";
}
你能给我一些建议,应该如何解决这个问题:)?
答案 0 :(得分:2)
在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");