java - 如何动态选择一个resultMap并将一个递增的整数值附加到MyBatis中的“不存在”列?
问题描述
我在 MYSQL 数据库中有一个特定的结果集,使用演员及其相关表的 sakila 数据库:
actor_id first_name last_name title
1 PENELOPE GUINESS ANACONDA CONFESSIONS
1 PENELOPE GUINESS ANGELS LIFE
我已经使用以下结果映射成功地在 MyBatis Plus 中映射了以下数据:
<resultMap id="actor" type="java.util.TreeMap">
<result property="id" column="id" />
<result property="firstname" column="first_name" />
<result property="lastname" column="last_name" />
<collection property="movies" javaType="ArrayList" resultMap="movies" />
</resultMap>
<resultMap id="movies" type="java.util.TreeMap">
<result property="title" column="title" />
</resultMap>
SQL 查询如下所示:
<select id="getActors" parameterType="ActorDetailsDTO" resultMap="actor">
select
a.actor_id,
first_name,
last_name,
title
from actor a left join
film_actor fa on a.actor_id = fa.actor_id left join
film f on fa.film_id = f.film_id
where a.actor_id = #{id}
</select>
这反过来又实现了以下结果:
result :{
"id" : 1,
"movies":[
{
title : "ANACONDA CONFESSIONS"
},
{
title : "ANGELS LIFE"
},
],
"firstname" : "PENELOPE",
"lastname" : "GUINESS"
}
但是我发现很难添加一个“不存在”的列名“movielist”,其值为“blockbuster X”,其中 X 是从 1 到 N 的递增数字。
我希望达到这个结果:
result :{
"id" : 1,
"movies":[
{
"movielist" : "blockbuster 1",
"title" : "ANACONDA CONFESSIONS"
},
{
"movielist" : "blockbuster 2",
"title" : "ANGELS LIFE"
},
],
"firstname" : "PENELOPE",
"lastname" : "GUINESS"
}
而且,当然,如果我有两个或更多演员,“大片 X”将回到 1 给第二个演员。
我在 SQL 查询中所做的是我添加了一个变量计数器,但计数只是继续计数,而不是为新参与者重置。
感谢您提供的任何帮助。
解决方案
应该可以使用变量,但这是使用子查询的另一种方法。
<select id="getActors" resultMap="actor">
select
a.actor_id,
first_name,
last_name,
fa.film_id,
concat('blockbuster ', (select count(*) from film_actor fa2
where a.actor_id = fa2.actor_id and fa2.film_id <= fa.film_id)) movielist,
title
from actor a
left join film_actor fa on a.actor_id = fa.actor_id
left join film f on fa.film_id = f.film_id
order by a.actor_id, fa.film_id;
</select>
这是结果图。
<id />
添加元素以提高效率。
<resultMap id="actor" type="java.util.TreeMap">
<id property="id" column="actor_id" />
<result property="firstname" column="first_name" />
<result property="lastname" column="last_name" />
<collection property="movies" javaType="list"
resultMap="movies" />
</resultMap>
<resultMap id="movies" type="java.util.TreeMap">
<id column="film_id" /><!-- not stored in map -->
<result property="movielist" column="movielist"
javaType="string" /><!-- CONCAT returns VARBINARY -->
<result property="title" column="title" />
</resultMap>
推荐阅读
- javascript - Angular - LocalStorage 启动时为空,刷新时填充(F5)
- sql - 如何根据 sysdate 获取过去一年的不同日期范围
- ruby - 如何在单个 CLI 命令中本地执行托管在 github 上的 ruby 脚本
- php - 如何在没有连接列的情况下映射一对一关系(实体通过它们的 ID 连接)?
- java - 如何获取Jtable中选定行的值
- ios - 如何从 Apple AppStore 获取 App 的所有评论?
- python - 如何修复 Python 中主机名错误的无效语法
- qt - 在 QML QList 中接收带有参数的 c++ 信号
- amazon-web-services - AWS Lambda IAM 无法连接 AWS IoT
- maven - 如何在 pom.xml 中指定对存储库中项目的依赖?