Проблема с обработчиком MyBatis в моем примере загрузки Spring для объекта картыJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с обработчиком MyBatis в моем примере загрузки Spring для объекта карты

Сообщение Anonymous »

У меня возникла проблема с реализацией пользовательского обработчика для Map через MyBatis в моем примере Spring Boot.
Вот мой объект запроса, показанный ниже
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class QueryRequest implements Serializable {

private List years;
private List months;
private List region;
private List office;

}

Вот объект ответа, показанный ниже
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TaskCountResponse implements Serializable {

private String region;
private String office;
private Map monthlyCounts;

}

Вот дао, показанное ниже
@Repository
public interface QueryTaskDao {

List getTaskStatusCounts(QueryRequest queryRequest);
}

Вот пользовательский обработчик для Map, показанный ниже
@Slf4j
public class MapTypeHandler extends BaseTypeHandler {

private static final ObjectMapper objectMapper = new ObjectMapper();

@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map parameter, JdbcType jdbcType) throws SQLException {
try {
String json = objectMapper.writeValueAsString(parameter);
log.info("MapTypeHandler | setNonNullParameter | json : " + json);
ps.setString(i, json);
} catch (IOException e) {
throw new SQLException("Error converting Map to JSON", e);
}
}

@Override
public Map getNullableResult(ResultSet rs, String columnName) throws SQLException {
try {
String json = rs.getString(columnName);
log.info("MapTypeHandler | getNullableResult(ResultSet rs, String columnName) | json : " + json);
if (json != null) {
return objectMapper.readValue(json, new TypeReference() {});
}
return null;
} catch (IOException e) {
throw new SQLException("Error converting JSON to Map", e);
}
}

@Override
public Map getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
try {
String json = rs.getString(columnIndex);
log.info("MapTypeHandler | getNullableResult(ResultSet rs, int columnIndex) | json : " + json);
if (json != null) {
return objectMapper.readValue(json, new TypeReference() {});
}
return null;
} catch (IOException e) {
throw new SQLException("Error converting JSON to Map", e);
}
}

@Override
public Map getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
try {
String json = cs.getString(columnIndex);
log.info("MapTypeHandler | getNullableResult(CallableStatement cs, int columnIndex) | json : " + json);
if (json != null) {
return objectMapper.readValue(json, new TypeReference() {});
}
return null;
} catch (IOException e) {
throw new SQLException("Error converting JSON to Map", e);
}
}
}

Вот XML-часть mybatis


















AND SUBSTRING(tt.task_finish_time, 1, 4) IN

#{year}





AND SUBSTRING(tt.task_finish_time, 6, 2) IN

#{month}





AND tt.region_name IN

#{region}





AND tt.office_name IN

#{office}







SELECT
tt.region_name,
tt.office_name,





COUNT(CASE WHEN SUBSTRING(tt.task_finish_time, 1, 7) = CONCAT(#{year}, '-', #{month}) THEN 1 END) AS month_${year}_${month}




FROM
task_list tt

GROUP BY
tt.region_name,
tt.office_name
ORDER BY
tt.region_name_en ASC;



Когда я отправляю запрос на http://localhost:8048/statistic/getTaskCountsbyTime
{
"years": ["2022", "2023"],
"months": ["01", "02", "03"],
"region": ["A Region", "B Region"],
"office": ["A Region Office", "B Region Office"]
}

Я получил такой ответ
[
{
"region": "A Region",
"office": "A Region Office",
"monthlyCounts": null
},
{
"region": "B Region",
"office": "B Region Office",
"monthlyCounts": null
}
]

Ответ должен выглядеть примерно так (с фактическим количеством вместо нуля):
[
{
"region": "A Region",
"office": "A Region Office",
"monthlyCounts": {
"month_2022_01": 10,
"month_2022_02": 15,
"month_2022_03": 12,
"month_2023_01": 5,
"month_2023_02": 7,
"month_2023_03": 6
}
},
{
"region": "B Region",
"office": "B Region Office",
"monthlyCounts": {
"month_2022_01": 8,
"month_2022_02": 14,
"month_2022_03": 13,
"month_2023_01": 4,
"month_2023_02": 6,
"month_2023_03": 9
}
}
]

Я получаю нулевое число ежемесячных счетчиков. В чем проблема в XML-сопоставителе или обработчике типа сопоставителя?
Можете ли вы пересмотреть его, чтобы исправить?
Первая попытка

SELECT
tt.region_name AS region,
tt.office_name AS office,

CONCAT(
'{',


CONCAT('"month_${year}_${month}":',
COUNT(CASE WHEN SUBSTRING(tt.task_finish_time, 1, 7) = CONCAT(#{year}, '-', #{month}) THEN 1 END))

,
'}'
) AS monthlyCounts

FROM
task_list tt

GROUP BY
tt.region_name,
tt.office_name
ORDER BY
tt.region_name_en ASC;


Я также исправил его, но получаю это сообщение об ошибке
Cause: java.sql.SQLException: Error converting JSON to Map
; uncategorized SQLException; SQL state [null]; error code [0]; Error converting JSON to Map; nested exception is java.sql.SQLException: Error converting JSON to Map] with root cause
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('"' (code 34)): was expecting comma to separate Object entries
at [Source: (String)"{"month_2022_01":0"month_2022_02":0"month_2022_03":0"month_2023_01":3"month_2023_02":4"month_2023_03":8}"; line: 1, column: 20]


Подробнее здесь: https://stackoverflow.com/questions/792 ... map-object
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»