You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整JPQL查询,使返回List<Map<Integer,String>>以ID为键评论为值

解决方案

JPQL的new map语法无法直接生成以实体属性值为键的Map(只能用固定别名或索引作为键),你可以通过以下两种方式实现需求:

方法一:查询后Java代码转换(推荐,简单易维护)

  1. 先修改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);
  1. 在业务代码里遍历转换结果,生成目标格式的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:35:19