从结果集中删除重复的行

时间:2011-11-08 07:55:46

标签: hibernate spring

我正在使用Hibernate Template。 从控制器我调用DAO方法如下:

List<SearchQuestionnaire> lst = 
           questionnaireDAO.listQuestionnaire(searchQuestionnaire);

在DAO中我得到如下结果集:

String queryString1 = "select 
  new com.apple.ist.cm.ruleadmin.model.SearchQuestionnaire
      (qc.questionCategoryID,
       qc.questionCategoryName,
       qn.questionReferenceString,
       qn.question,
       qao.answerOptionGroupID,
       aog.answerOptionGroup,
       ans.answerStringValue) "
      + "from Questionnaire qn,
              QuestionCategory qc,
              QuestionAnswerOption qao,
              AnswerOptionGroup aog,
              AnswerString ans " 
      + "where 
             qn.questionCategoryID = qc.questionCategoryID 
         and qn.questionID=qao.questionID 
         and qao.answerOptionGroupID=aog.answerOptionGroupID 
         and qao.answerStringID=ans.answerStringID";

query1 = (List<SearchQuestionnaire>) hibernateTemplate.find(queryString1);

现在从query1,我得到的结果如下:

  A    | B  | C  |    D
  -----|----|----|-----
    a1 | b1 | c1 | d1
    a1 | b1 | c1 | d2
    a1 | b1 | c1 | d3
    a2 | b2 | c2 | d4
    a2 | b2 | c2 | d5

现在在JSP中,我希望显示A,B,C,D的所有值。但A,B和C值在一行中,当展开行D值时,应显示如下:

   a1 | b1  | c1      
   -------------
     d1
     d2
     d3 

   a2 | b2  | c2      
   -------------
     d4
     d5 

现在我在删除A,B和C列中的重复值方面遇到了问题。

请在上面提出建议。这里请考虑A,B,C和D是“queryString1”select子句的值。

1 个答案:

答案 0 :(得分:1)

创建一个ABC类,包含A,B和C.使其成为不可变的并实现hashCodeequals,以便两个具有相同A,B和C值的ABC实例具有相同的hashCode并且彼此相等。

然后,构建一个Map<ABC, List<D>>存储由其ABC元组索引的所有Ds。迭代地图的条目。每个条目将导致一个新的ABC部分。对于每个条目,迭代其Ds列表。每个元素都将导致该部分中的新行。

请注意,您的HQL查询显示您没有映射实体之间的关联。你几乎不应该像这样在两个实体之间创建连接:QuestionAnswerOption应该与其问题直接关联(ManyToOne关联),而不是保留其问题的ID。