Как вернуть Map<String, List<Object>> с помощью mybatis

это написанный gpt код, но он не может вернуть то, что я хочу, я хочу, чтобы эта функция возвращала тип данных Map<String,List>, строка - это имя категории

<resultMap id = "articles" type = "com.toc.content.pojo.Article">
        <result column = "title" property = "title" />
        <result column = "content" property = "content" />
        <result column = "state" property = "state"/>
    </resultMap>

    <resultMap id = "CategoryArticleMap" type = "java.util.HashMap">
        <id column = "category_name" property = "key"/>
        <collection property = "value" ofType = "com.toc.content.pojo.Article" resultMap = "articles"/>
    </resultMap>

    <select id = "getCategoryArticlesMap" resultMap = "CategoryArticleMap">
        select c.category_name, a.title, a.content, a.state
        from category c
        left join article a
        on c.id = a.category_id
        where c.category_name is not null
        order by c.category_name
    </select>

в моей статьеDao.java

@MapKey("category_name")
Map<String, List<Article>> getCategoryArticlesMap();

Я хочу получить этот тип из JSON

{  "art":[
           {"title":"xxx",
            "author":"yyy"
           },
          {"title":"ppp",
            "author":"ssy"
           }, 
        ],
}

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, MyBatis не может напрямую сопоставить результаты с таким комплексом java.util.Map.

Если результатом должен быть Map, вы можете указать MyBatis вернуть List из Map и преобразовать его в код Java.

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.ibatis.annotations.Select;

public interface Mapper {
  @Select("""
      select c.category_name, a.title, a.author
      from category c
      left join article a on c.id = a.category_id
      where c.category_name is not null
      order by c.category_name
      """)
  List<Map<String, Object>> selectMaps();

  default Map<String, List<Article>> getCategoryArticlesMap() {
    return selectMaps().stream().collect(Collectors.groupingBy(m -> (String) m.get("category_name"),
        Collectors.mapping(m -> new Article((String) m.get("title"), (String) m.get("author")), Collectors.toList())));
  }
}

Обратите внимание, что некоторые базы данных возвращают имя столбца заглавными буквами.


К вашему сведению: если вы определяете POJO, MyBatis может напрямую сопоставить результаты.

import java.util.List;

public class CategoryWithArticles {
  private String categoryName;
  private List<Article> articles;

  public String getCategoryName() {
    return categoryName;
  }

  public void setCategoryName(String categoryName) {
    this.categoryName = categoryName;
  }

  public List<Article> getArticles() {
    return articles;
  }

  public void setArticles(List<Article> articles) {
    this.articles = articles;
  }
}

Картограф будет выглядеть примерно так.

<resultMap type = "test.Article" id = "articleRM">
  <id property = "title" column = "title" />
  <result property = "author" column = "author" />
</resultMap>

<resultMap type = "test.CategoryWithArticles" id = "beanRM">
  <id property = "categoryName" column = "category_name"/>
  <collection property = "articles" resultMap = "articleRM" />
</resultMap>

<select id = "selectBeans" resultMap = "beanRM">
  select c.category_name, a.title, a.author
  from category c
  left join article a on c.id = a.category_id
  where c.category_name is not null
  order by c.category_name
</select>

Вот сигнатура метода картографа.

List<CategoryWithArticles> selectBeans();

Другие вопросы по теме