это написанный 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"
},
],
}
К сожалению, 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();