如何使用Play仅将特定字段集更新到数据库?目前我有一个包含特定字段的User
模型,请调用它:isAdministrator
:
private boolean isAdministrator;
我有访问方法:
/**
* @return the isAdministrator
*/
public boolean isAdministrator() {
return isAdministrator;
}
/**
* @param isAdministrator
* the isAdministrator to set
*/
public void setAdministrator(boolean isAdministrator) {
this.isAdministrator = isAdministrator;
}
但是当我更改用户名时,通过不包含isAdministrator
的表单,播放会重置我的用户对象并为此用户设置值0
?
那么,我如何才更新已更改的字段?
答案 0 :(得分:4)
我没有直接回答您的问题,但是我没有使用布尔表示您的用户是管理员,而是创建一个继承自用户的Admin
类。
public class Admin extends User {
....
}
修改强>
在控制器中,您可以在使用表单值进行更新之前从数据库加载旧值:
...
User userFromDB = User.findById(anId);
User userFromForm = userForm.get();
// set previous value
userFromForm.setArchived(userFromDB.getArchived());
User.update(userFromForm);
...
答案 1 :(得分:2)
除了 nico的回答之外,我只能添加,在每种情况下都不需要使用Form
类。有时仅仅从请求中获取数据并手动更新对象就足够了,当您具有详细的中间保存级别时,尤其是对于ajax调用非常有用(请参阅使用DynamicForm的示例,它可以更短,并且{{3 }}:
public static Result updateName(Integer id){
User user = User.find.byId(id);
user.name = form().bindFromRequest().get("name");
user.update(id);
return ok();
}
答案 2 :(得分:2)
您可以指定要更新的字段。假设您要更新名称,那么您将这样做:
Ebean.update(user, new HashSet<String>(Arrays.asList("name")));