如何在hibernate3中将多行合并为一行

时间:2014-11-18 04:21:58

标签: java sql-server spring hibernate

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

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());
}

上述逻辑在前两次迭代中工作正常。之后它会抛出索引outofbound异常。我知道异常被抛出,因为项目2只包含2行。

他们有什么方法可以在hibernate3中获得所需的结果吗?任何帮助都将不胜感激!!!!

3 个答案:

答案 0 :(得分:0)

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

  • 专案编号
  • activityId
  • 日期

价值将是多少小时。

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

答案 1 :(得分:0)

您必须通过projectId,activityId和Date执行订单。检索列表循环之后,直到遇到下一个activityId(直到然后添加到同一个对象),然后添加到一个新对象,并在之间将日期添加到对象内的List,以便您可以迭代它在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>();
    }
}

答案 2 :(得分:0)

我认为你必须在Java Side构建你期望的表而不是Hibernate。

List<Timesheet> timesheetList = <Your Method>
项目日期产生的

过滤器。 或者你可以制作一个转换器,它将返回你期望的行

我不这么认为你的标准查询将在第二个表格结果上面返回你所期望的结果。