如何调整JPQL查询,使返回List<Map<Integer,String>>以ID为键评论为值
解决方案
JPQL的new map语法无法直接生成以实体属性值为键的Map(只能用固定别名或索引作为键),你可以通过以下两种方式实现需求:
方法一:查询后Java代码转换(推荐,简单易维护)
- 先修改JPQL查询,给字段添加明确别名,方便后续取值:
@Query("select new map(ques_res.id as responseId, qbe.comment as comment) " + "from SurveyResponseAnswerComments qbe " + "left join SurveyQuestionnaireResponse ques_res on qbe.queResponseId = ques_res.id " + "where ques_res.questionnaireId = :questionnaireId " + "and ques_res.inviteeId = :employeeId " + "and qbe.tenant.id = :tenantId " + "and ques_res.id IN (:responseIds)") List<Map<String, Object>> getRawCommentsMap( @Param("questionnaireId") Integer questionnaireId, @Param("employeeId") Integer employeeId, @Param("responseIds") List<Integer> responseIds, @Param("tenantId") Integer tenantId);
- 在业务代码里遍历转换结果,生成目标格式的Map列表:
List<Map<String, Object>> rawResult = yourRepository.getRawCommentsMap(questionnaireId, employeeId, responseIds, tenantId); List<Map<Integer, String>> finalResult = new ArrayList<>(); for (Map<String, Object> rawEntry : rawResult) { Integer responseId = (Integer) rawEntry.get("responseId"); String comment = (String) rawEntry.get("comment"); Map<Integer, String> singleEntryMap = new HashMap<>(); singleEntryMap.put(responseId, comment); finalResult.add(singleEntryMap); }
方法二:原生SQL配合结果转换
如果希望在查询层完成转换,可以使用原生SQL,再通过自定义结果处理器生成目标结构(注意替换表名和字段名为实际数据库对应名称):
@Query(value = "select ques_res.id as response_id, qbe.comment as comment " + "from survey_response_answer_comments qbe " + "left join survey_questionnaire_response ques_res on qbe.que_response_id = ques_res.id " + "where ques_res.questionnaire_id = :questionnaireId " + "and ques_res.invitee_id = :employeeId " + "and qbe.tenant_id = :tenantId " + "and ques_res.id IN (:responseIds)", nativeQuery = true) List<Object[]> getRawNativeComments( @Param("questionnaireId") Integer questionnaireId, @Param("employeeId") Integer employeeId, @Param("responseIds") List<Integer> responseIds, @Param("tenantId") Integer tenantId);
然后转换结果:
List<Object[]> rawNativeResult = yourRepository.getRawNativeComments(...); List<Map<Integer, String>> finalResult = new ArrayList<>(); for (Object[] entry : rawNativeResult) { Integer responseId = (Integer) entry[0]; String comment = (String) entry[1]; Map<Integer, String> singleEntryMap = new HashMap<>(); singleEntryMap.put(responseId, comment); finalResult.add(singleEntryMap); }
补充说明:你原来的查询返回键为"0"和"1",是因为
new map(ques_res.id, qbe.comment)未指定别名,JPQL默认用参数索引作为键,添加别名后可以避免这种模糊的键名。
内容的提问来源于stack exchange,提问作者Avinash S
相关产品推荐
相关产品推荐

