2011-11-08 135 views
0

我正在使用休眠模板。 从控制器我打电话像下面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

创建类ABC,含A,B和C.使它不可改变和实施hashCodeequals,使得具有用于A,B和C具有相同的值ABC的两个实例有相同的hashCode和相等的其他。

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

请注意,您的HQL查询显示您没有按照它们应该映射实体之间的关联。您几乎不应该在两个实体之间创建连接,如下所示:QuestionAnswerOption应该与其问题具有直接关联(ManyToOne关联),而不是持有其问题的ID。

+0

我没有创建实体之间的任何关系,因为它导致了一些其他问题。因此,我正在使用HQL与“新”。用我的方法是否有任何解决方案来删除显示的重复条目?在这里,我可以去调用两个查询 - 一个用A,B和C,其次用A,B,C和D通过AJAX单击展开按钮。但它会成为DB的两个呼叫。 – Chandu

+0

您的示例中没有任何重复条目:所有返回的行都不相同。按照我在答案中解释的结果处理结果。 –