【问题标题】:Get only specific records of data in Liferay仅获取 Liferay 中的特定数据记录
【发布时间】:2023-03-18 11:20:01
【问题描述】:

我正在使用 Liferay 开发一个模块。一部分涉及仅从数据库中获取员工休假状态为待处理的那些记录。我必须获取“待处理”记录的代码是:

  @SuppressWarnings("unchecked")
   public static List<Employee> getEmployeeData() throws    PortalException, SystemException{

   List<Employee> employeeDetails;

   try{
    int totalEmployees = EmployeeLocalServiceUtil.getEmployeesCount();
            for(Employee emp: employeeDetails   {
               if(emp.getEmpStatus.equals("Pending")  {
    employeeDetails=  EmployeeLocalServiceUtil.getEmployees(0,totalEmployees);
           }
    }           
                      }catch(SystemException se){
                          employeeDetails = Collections.emptyList();
                     }


                     return employeeDetails;
                }

以上代码获取所有详细信息 - 待处理和非待处理。我知道这是因为上面代码中的语句:

employeeDetails=EmployeeLocalServiceUtil.getEmployees(0,totalEmployees);

因为它获取所有行。那么我应该如何构建和修改我的代码以仅获取待处理的详细信息?

【问题讨论】:

    标签: java database liferay liferay-6


    【解决方案1】:

    当您在 Liferay 中处理自定义实体时,您可以在 service.xml 中使用 finder 标签来处理这种情况。在 service.xml 中为 empStatus 字段定义查找器。

    <finder name="EmpStatus" return-type="Collection">
      <finder-column name="empStatus"/>
    </finder>
    

    这将在 **Persistence.java 中创建 finder[findByEmpStatus(String status)] 方法,该方法将根据 status 返回特定的行,现在您需要手动将方法添加到您的 *(Local) ServiceImpl.java 文件。这些方法将调用您的 *persitence.finderMethodName() 方法。

    HTH,

    【讨论】:

    • 我尝试创建您建议的查找器方法并运行服务构建器。它没有在 Persistence.java 中创建 finder 方法
    • 它必须创建它,你可以刷新你的工作区并再次检查!
    • Pankaj 我使用动态查询实现。谢谢你的帮助! :)
    • 我刷新了我的工作区,刷新了项目,重新启动了服务器 :)...但是没有创建 empStatus 的 finder 方法。
    【解决方案2】:

    一个快速但非常糟糕的做法是让您的代码保持这种更改:

    List<Employee> employeeDetails = new ArrayList<Employee>;
    try{
    
    List<Employees> allEmployees = EmployeeLocalServiceUtil.getAllEmployees();
    
            for(Employee emp: allEmployees {
               if(emp.getEmpStatus.equals("Pending")  {
    employeeDetails.add(emp);
           }
    }return employeeDetails;      
    

    现在,正确的做法是:

    1. 添加一个 Finder,正如@Pankaj Kathiriya 已经提议的那样。然后,构建服务
    2. 转到EmployeeLocalServiceImpl,并添加

      public List getAllEmployeesByEmpStatus (String status) { 
      try { 
          return employeePersistence.findByEmpStatus(status); 
      } catch (SystemException e) {
          e.printStackTrace(); return Collections.emptyList(); 
          }
      }
      

    然后再次构建服务

    1. 将您的代码替换为

          List employeeDetails = EmployeeLocalServiceUtil.getAllEmployeesByEmpStatus("Pending") ; 
      return employeeDetails;
      

    【讨论】:

    • 再次感谢!!记住?你也帮助我解决了其他问题! :) 嘿,你能帮我吗:stackoverflow.com/questions/16171384/…
    • 嘿,Seeya,我刚刚从这里获得了“顽强”徽章。这意味着我的太多答案被接受但没有被赞成。如果您倾向于帮助没有足够代表进行投票的新用户,通常会发生这种情况。所以,我只是在徘徊..既然你有代表投票,有什么理由不赞成这个吗?
    • 我认为我也接受了您对其他问题的回答。我认为它会为您赢得声誉并增加您的徽章和东西。但对这个“顽强”徽章一无所知。我来这里已经有两个月了:)但不是很熟悉。再次向你道歉。你想摆脱顽强的徽章吗?你告诉我我必须为此做些什么。
    • 你不必为任何事情道歉。你可以投票任何你喜欢的东西,你不必解释任何事情。我问只是因为我很好奇。在我的书中,赞成比接受答案更容易,但这只是我。别担心,你没有做错任何事,而且,我喜欢徽章;)
    • 我的意思是我们可以在哪里保持联系,这样我就可以联系你寻求编码方面的帮助
    【解决方案3】:

    我有一个解决方案。我在论坛中收到了在 liferay 中使用动态查询的建议。

    而且很简单。

    在 liferay 上阅读有关动态查询的 wiki。

    好吧,回答我自己的问题,这是我找到的解决方案:

      DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(LeaveApplication.class);
    
      dynamicQuery.add(PropertyFactoryUtil.forName("EmpStatus").eq("Pending"));
    

    然后我返回那些状态未决的人..

    希望它对某人有所帮助..欢迎更多建议:)

    【讨论】:

    • Seeya,DynamicQuery 的结果不会被缓存,但是 finder 的结果会被缓存。我相信,您已经为实体 LeaveApplication 添加了 finder 标签。
    • @Pankaj Kathiriya:是的,我已经为实体 LeaveApplication 添加了 finder 标签。但我不明白为什么它没有在持久性类中创建方法.. Pankja 我有另一个查询。我读到动态查询比使用查找器标签更好。当然,由于我的查询只是获取那些状态为 Pending 的条目,所以它并不重要。
    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多