我正在使用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子句的值。
答案 0 :(得分:1)
创建一个ABC类,包含A,B和C.使其成为不可变的并实现hashCode
和equals
,以便两个具有相同A,B和C值的ABC实例具有相同的hashCode并且彼此相等。
然后,构建一个Map<ABC, List<D>>
存储由其ABC元组索引的所有Ds。迭代地图的条目。每个条目将导致一个新的ABC部分。对于每个条目,迭代其Ds列表。每个元素都将导致该部分中的新行。
请注意,您的HQL查询显示您没有映射实体之间的关联。你几乎不应该像这样在两个实体之间创建连接:QuestionAnswerOption应该与其问题直接关联(ManyToOne关联),而不是保留其问题的ID。