我需要以编程方式更新我的数据库中现有用户的信息我需要更新 Liferay 数据库中 user_ 表中的用户名出生日期值基本上我需要运行更新查询。
4 回答
不建议直接更新 liferay 数据库,你应该使用 Liferay API 来做这些事情。根据这个liferay论坛帖子:
Liferay 数据库没有发布是有原因的。原因是 API 所做的事情远远多于简单的 SQL 插入语句。有内部管理的外键,不仅在数据库中更新,而且在索引、jackrabbit 等中也有更新。
由于所有这些都是由代码而不是由数据库管理的,因此对代码的任何更新都会改变数据库的更新方式和时间。即使它在 6.1 GA1 版本中对您有用,GA2 也会在几周后发布,并且数据库/代码可能会再次更改。
坚持使用 API 是确保更改正确完成的唯一方法。
好的讲道,回到你的问题,这里有一些方法可以做到:
您可以构建自定义 portlet 并使用 liferay 的服务并使用
UserLocalServiceUtil.updateUser()
方法更新用户名、生日等。或者,您可以构建基于 SOAP 或 JSON 的 Web 服务客户端来更新将调用相同方法的详细信息
或者您可以使用Liferay 的 Beanshell 工具从控制面板执行此操作,以下是一些更新用户的代码(为您尽快创建):
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 的
UserLocalServiceImpl#updateUser
方法源代码构建的
如果您想知道什么是 bean-shell 以及将这段代码放在哪里,您可以在 Liferay 控制面板中找到它Control Panel--> Server--> Server Administration-->Script
这取决于您是否必须在 portlet 代码中执行此操作,或者通过向 db 发送直接查询来执行此操作。
Liferay 基本上会缓存所有内容,因此如果您在门户运行时更新 Liferay 数据库中的记录,很可能该记录已经在缓存中,因此根本不会读取新的列值。您必须通过转到控制面板-> 服务器管理来清除数据库缓存。
相反,如果您必须在 portlet 代码中做这样的事情,您应该调用 Liferay 服务的方法之一。您正在尝试更新用户,因此您应该调用该方法UserLocalServiceUtil.updateUser
(或者UserServiceUtil.updateUser
如果您还想检查权限)。您可以看到有一些不同updateUser
的方法,其中一个有很多参数,另一个只有 bean 作为参数。虽然第一个包含所有业务逻辑(验证、重新索引、更新相关实体等),但第二个只是自动生成的,不应使用(除非您完全知道自己在做什么)。因此,使用带有很多参数的方法,如果您不想更改该列的值,只需传递user.getCOLUMN()
(例如)。user.getFacebookId()
希望对您有所帮助,并为我的英语不好感到抱歉...
试试这个代码..
这里我只更新用户名(其余的你可以自己做)
userId = 您可以使用主题显示来获取此信息
User user = UserLocalServiceUtil.getUser(userId);
user.setFirstName("new name");
UserLocalServiceUtil.updateUser(user);
希望对你有帮助 !!!
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");
通过第一次更新查询,您可以更改用户的名字、姓氏,通过第二次查询,您可以更改用户的出生日期。
希望清楚!