5

我需要以编程方式更新我的数据库中现有用户的信息我需要更新 Liferay 数据库中 user_ 表中的用户名出生日期值基本上我需要运行更新查询。

4

4 回答 4

7

不建议直接更新 liferay 数据库,你应该使用 Liferay API 来做这些事情。根据这个liferay论坛帖子

Liferay 数据库没有发布是有原因的。原因是 API 所做的事情远远多于简单的 SQL 插入语句。有内部管理的外键,不仅在数据库中更新,而且在索引、jackrabbit 等中也有更新。

由于所有这些都是由代码而不是由数据库管理的,因此对代码的任何更新都会改变数据库的更新方式和时间。即使它在 6.1 GA1 版本中对您有用,GA2 也会在几周后发布,并且数据库/代码可能会再次更改。

坚持使用 API 是确保更改正确完成的唯一方法。

好的讲道,回到你的问题,这里有一些方法可以做到:

  1. 您可以构建自定义 portlet 并使用 liferay 的服务并使用UserLocalServiceUtil.updateUser()方法更新用户名、生日等。

  2. 或者,您可以构建基于 SOAP 或 JSON 的 Web 服务客户端来更新将调用相同方法的详细信息

  3. 或者您可以使用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

Liferay 豆壳

于 2013-05-06T09:36:27.257 回答
5

这取决于您是否必须在 portlet 代码中执行此操作,或者通过向 db 发送直接查询来执行此操作。

Liferay 基本上会缓存所有内容,因此如果您在门户运行时更新 Liferay 数据库中的记录,很可能该记录已经在缓存中,因此根本不会读取新的列值。您必须通过转到控制面板-> 服务器管理来清除数据库缓存。

相反,如果您必须在 portlet 代码中做这样的事情,您应该调用 Liferay 服务的方法之一。您正在尝试更新用户,因此您应该调用该方法UserLocalServiceUtil.updateUser(或者UserServiceUtil.updateUser如果您还想检查权限)。您可以看到有一些不同updateUser的方法,其中一个有很多参数,另一个只有 bean 作为参数。虽然第一个包含所有业务逻辑(验证、重新索引、更新相关实体等),但第二个只是自动生成的,不应使用(除非您完全知道自己在做什么)。因此,使用带有很多参数的方法,如果您不想更改该列的值,只需传递user.getCOLUMN()(例如)。user.getFacebookId()

希望对您有所帮助,并为我的英语不好感到抱歉...

于 2013-05-06T08:35:08.917 回答
2

试试这个代码..

这里我只更新用户名(其余的你可以自己做)

userId = 您可以使用主题显示来获取此信息

User user = UserLocalServiceUtil.getUser(userId);
user.setFirstName("new name");
UserLocalServiceUtil.updateUser(user);

希望对你有帮助 !!!

于 2013-05-06T07:28:30.583 回答
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");

通过第一次更新查询,您可以更改用户的名字、姓氏,通过第二次查询,您可以更改用户的出生日期。

希望清楚!

于 2013-05-06T06:43:20.407 回答