我需要以编程方式更新数据库中现有用户的信息 我需要更新Liferay数据库中用户表中的用户名出生日期值 基本上我需要运行更新查询。
答案 0 :(得分:7)
不建议直接更新liferay数据库,您应该使用Liferay API来执行这些操作。根据{{3}}:
Liferay数据库因某种原因未发布。原因是API比简单的SQL插入语句要多得多。有内部管理的外键,有些东西不仅在数据库中更新,还在索引中,在jackrabbit等中更新。
由于所有这些都是由代码而不是数据库管理的,因此对代码的任何更新都将改变数据库更新的方式和时间。即使它在6.1 GA1版本中适用于您,GA2也会在几周内推出,数据库/代码可能会再次发生变化。
坚持使用API是确保更改正确完成的唯一方法。
足够好的讲道和回到你的问题,这里有一些方法可以做到这些:
UserLocalServiceUtil.updateUser()
方法更新用户名,生日等。或者您可以使用this liferay forum post从控制面板执行此操作,以下是一些更新用户的代码(仅为您创建 ASAP ):
import com.liferay.portal.model.Company;
import com.liferay.portal.model.Contact;
import com.liferay.portal.model.ContactConstants;
import com.liferay.portal.model.User;
import com.liferay.portal.service.CompanyLocalServiceUtil;
import com.liferay.portal.service.ContactLocalServiceUtil;
import com.liferay.portal.service.UserLocalServiceUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
long companyId = 10135; // this would be different for you
User user = UserLocalServiceUtil.getUserByEmailAddress(companyId, "test@liferay.com");
// Updating User's details
user.setEmailAddress("myTest@liferay.com");
user.setFirstName("First Test");
user.setLastName("Last Test");
user.setScreenName("myTestScreenName");
UserLocalServiceUtil.updateUser(user, false);
// Updating User's Birthday
// December 12, 1912
int birthdayMonth = 11;
int birthdayDay = 12;
int birthdayYear = 1912;
Calendar cal = new GregorianCalendar();
cal.set(birthdayYear, birthdayMonth, birthdayDay, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
Date birthday = cal.getTime();
System.out.println("Updated User: " + user + "\nBirthdate to be updated: " + birthday);
long contactId = user.getContactId();
Contact contact = ContactLocalServiceUtil.getContact(contactId);
if(contact == null) {
contact = ContactLocalServiceUtil.createContact(contactId);
Company company = CompanyLocalServiceUtil.getCompany(user.getCompanyId());
contact.setCompanyId(user.getCompanyId());
contact.setUserName(StringPool.BLANK);
contact.setCreateDate(new Date());
contact.setAccountId(company.getAccountId());
contact.setParentContactId(ContactConstants.DEFAULT_PARENT_CONTACT_ID);
}
contact.setModifiedDate(new Date());
contact.setBirthday(birthday);
ContactLocalServiceUtil.updateContact(contact, false);
System.out.println("Users birthdate updated successfully");
联系人代码是在Liferay的Liferay's Beanshell tool方法
如果您想知道什么是bean-shell以及放置此代码的位置,可以在Liferay控制面板中找到它控制面板 - > 服务器 - > 服务器管理 - > 脚本
答案 1 :(得分:5)
这取决于您是否必须在portlet代码中执行此操作或通过向db发送直接查询。
Liferay基本上缓存了所有内容,因此如果在门户网站运行时更新Liferay数据库中的记录,则很可能该记录已经在缓存中,因此根本不会读取新列值。您必须转到控制面板 - >清除数据库缓存。服务器管理。
相反,如果您必须在portlet代码中执行此类操作,则应调用Liferay服务的其中一种方法。您正在尝试更新用户,因此您应该调用方法UserLocalServiceUtil.updateUser
(如果您还想检查权限,则调用UserServiceUtil.updateUser
)。
您可以看到有一些不同的updateUser
方法,其中一个有很多参数,另一个只有bean作为参数。虽然第一个包含所有业务逻辑(验证,重新索引,相关实体的更新等),但第二个只是自动生成,不应该使用(除非您完全知道自己在做什么)。因此,如果您不想更改该列的值,请使用包含大量参数的方法,只需传递user.getCOLUMN()
(例如user.getFacebookId()
)。
希望它有所帮助,抱歉我的英语不好......
答案 2 :(得分:2)
update user_ set firstName="New First Name", lastName="New Last Name" where emailAddress="test@test.com";
update contact_ set birthday="date string" where contactId in(select contactId from user_ where emailAddress="test@test.com");
通过第一次更新查询,您可以更改用户的firstName,lastName,通过第二次查询,您可以更改用户的生日。
希望它清楚!
答案 3 :(得分:2)
试试这段代码..
这里我只更新用户名字(你可以按自己的方式休息)
userId =您可以使用主题展示
来获取此内容User user = UserLocalServiceUtil.getUser(userId);
user.setFirstName("new name");
UserLocalServiceUtil.updateUser(user);
希望这会对你有帮助!!!