У меня возникла проблема с реализацией пользовательского обработчика для 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
Проблема с обработчиком MyBatis в моем примере загрузки Spring для объекта карты ⇐ JAVA
Программисты JAVA общаются здесь
1733673780
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]
Подробнее здесь: [url]https://stackoverflow.com/questions/79260900/mybatis-handler-issue-in-my-spring-boot-example-for-map-object[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия