【问题标题】:How to combine multiple rows into one in hibernate3如何在hibernate3中将多行合并为一行
【发布时间】:2014-11-18 04:21:57
【问题描述】:

在我的项目中,我必须以日期方式存储时间表条目。但以周方式显示。 例如我有一个下表

Id projectId activityId     Date       Spenttime
1     1       1          2014-11-10     8  
2     1       1          2014-11-11     8  
3     1       1          2014-11-12     8  
4     1       1          2014-11-13     8  
5     1       1          2014-11-14     8  
6     1       1          2014-11-15     8  
7     1       1          2014-11-16     8  
8     1       2          2014-11-10     8  
9     1       2          2014-11-11     8  
10    1       2          2014-11-12     8  
11    1       2          2014-11-13     8  
12    1       2          2014-11-14     8  
13    1       2          2014-11-15     8  
14    1       2          2014-11-16     8
15    2       1          2014-11-15     8
16    2       1          2014-11-16     8 

我想要上表这样的结果

projectId activityId 2014-11-10  2014-11-11 2014-11-12 2014-11-13 2014-11-14 2014-11-15 2014-11-16 
 1           1          8             8         8          8         8          8          8
 1           2          8             8         8          8         8          8          8
 2           1          0             0         0          0         0          8          8

以下是获得上述结果的休眠条件。

List<Timesheet> timesheetList=sessionfactory.getCurrentSession.createCriteria(Timesheet.class)
                              .add(Restrctions.between("date",formatter.parse("2014-11-09"),formatter.parse("2014-11-16"))
                              .list();   

检索逻辑:

List<DisplayTable> dispaly=new ArrayList<DisplayTable>();
for(int i=0;i<timesheetList.size();i+=7)
{
DisplayTable disp=new DisplayTable();
disp.setProjectId(timesheetList.get(i).getProjectId());
disp.setActivityId(timesheetList.get(i).getActivityId());
disp.setSpentTimeDate1(timesheetList.get(i).getSpentTime());
disp.setSpentTimeDate2(timesheetList.get(i+1).getSpentTime());
disp.setSpentTimeDate3(timesheetList.get(i+2).getSpentTime());
disp.setSpentTimeDate4(timesheetList.get(i+3).getSpentTime());
disp.setSpentTimeDate5(timesheetList.get(i+4).getSpentTime());
disp.setSpentTimeDate6(timesheetList.get(i+5).getSpentTime());
disp.setSpentTimeDate7(timesheetList.get(i+6).getSpentTime());
}

上述逻辑在前两次迭代中运行良好。之后它抛出索引出站异常。我知道抛出异常是因为项目 2 仅包含 2 行。

他们有什么方法可以在 hibernate3 中达到预期的结果吗?任何帮助将不胜感激!!!!

【问题讨论】:

    标签: java sql-server spring hibernate


    【解决方案1】:

    我认为这比 Hibernate 更像是一个数据设计问题。您似乎需要一个具有以下键的实体(表):

    • 项目ID
    • 活动 ID
    • 日期

    价值将是工作了多少小时。

    然后您可以迭代项目/活动/日期并构建一个如上所述的矩阵

    【讨论】:

    • ,对不起,我已经有一个像你的答案这样的实体。我忘了在我的问题中添加它。请查看编辑后的问题
    【解决方案2】:

    我认为您必须在 Java 端而不是通过 Hibernate 构建您的期望表。

    List<Timesheet> timesheetList = <Your Method>
    

    并按项目日期过滤结果。 或者您可以制作一个 Converter 来返回您期望的行

    而且我不这么认为,您的条件查询将返回高于第二个表结果的结果。

    【讨论】:

      【解决方案3】:

      您必须按 projectId、activityId 和 Date 进行排序。在检索列表循环直到遇到下一个activityId(直到添加到同一个对象)之后,添加到一个新对象并在两者之间将日期添加到对象内的列表中,以便您可以迭代它并在UI中显示。对 projectId 也应用相同的逻辑。

      List<DisplayTable> display = new ArrayList<DisplayTable>();
      DisplayTable disp=new DisplayTable();
      List<String> timeSheetHours = new ArrayList<String>();
      for(int i=0; i< timesheetList.size(); i+=7) {
          TimeSheet timeSheet = timesheetList.get(i); 
          disp.setProjectId(timeSheet.getProjectId());
          disp.setActivityId(timeSheet.getActivityId());
          // Add timesheet hours to the list
          timeSheetHours.add(timeSheet.getSpentTime());
          //TODO: check if the next record is different activity id,  
          if(true) {
              disp.setTimeSheetHours(timeSheetHoursList);
              display.add(disp);
              disp=new DisplayTable();
              timeSheetHours = new ArrayList<String>();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多