这当中 episode 的 id 获取为 null ,请问是哪里出了问题
@Select("select * from Anime t where t.id = #{id}")
@Results({
@Result(column = "id", property = "id", id = true),
@Result(column = "local_name", property = "localName"),
@Result(column = "origin_name", property = "originName"),
@Result(column = "image_path", property = "imagePath"),
@Result(column = "type", property = "type", typeHandler = BaseEnumTypeHandler.class),
@Result(column = "broadcast_time", property = "broadcastTime"),
@Result(column = "state", property = "state", typeHandler = BaseEnumTypeHandler.class),
@Result(column = "introduction_path", property = "introductionPath"),
@Result(column = "update_time", property = "updateTime"),
@Result(many = @Many(select = "org.watp.anifree.anime.dao.AnimeMapper.getSynthesizeEpisodesInfoByAnimeId"), property = "episodes", column = "id", javaType = ArrayList.class)
})
@CacheEnable(type = CacheType.PRIVATE, desc = "SynthesizeAnimeInfo", dataType = DataType.DATA, privateId = "${anime.id}")
AnimePO getSynthesizeAnimeInfoByPO(AnimePO anime);
@Select("select * from Episode t where t.anime_id = #{anime_id} order by t.ordr")
@Results({
@Result(column = "anime_id", property = "animeId"),
@Result(column = "image_path", property = "imagePath"),
@Result(many = @Many(select = "org.watp.anifree.anime.dao.AnimeMapper.getSynthesizePlaysInfoByEpisodeId"), property = "plays", column = "id", javaType = ArrayList.class)
})
List<EpisodePO> getSynthesizeEpisodesInfoByAnimeId(@Param("anime_id") String anime_id);
@Select("select * from Play t where t.episode_id = #{episode_id} order by t.ordr")
@Results({
@Result(column = "episode_id", property = "episodeId"),
@Result(column = "type", property = "type", typeHandler = BaseEnumTypeHandler.class)
})
List<PlayPO> getSynthesizePlaysInfoByEpisodeId(@Param("episode_id") String episode_id);
1
77yf77yf77yf OP create table Anime
( id varchar(16), local_name varchar(500) not null, origin_name varchar(500) not null, image_path varchar(500) not null, type char(1) not null, broadcast_time date not null, author varchar(50), producer varchar(50), state char(1) not null, introduction_path varchar(1000), update_time datetime not null, constraint ANIME_ID_PRIMARY primary key (id) ) create unique index ANIME_LOCALNAME_UNIQUE on Anime(local_name); create unique index ANIME_ORIGINNAME_UNIQUE on Anime(origin_name); create table Episode ( anime_id varchar(16), id varchar(16), name varchar(200) not null, image_path varchar(500), ordr int not null, constraint EPISODE_ID_PRIMARY primary key (id), constraint EPISODE_ANIMEID_FOREIGN foreign key (anime_id) references Anime(id) ) create unique index EPISODE_NAME_UNIQUE on Episode(name); create unique index EPISODE_ORDR_UNIQUE on Episode(anime_id,ordr); create table Play ( id varchar(16), episode_id varchar(16), name varchar(200) not null, type char(1) not null, location varchar(500), ordr int not null, constraint PLAY_ID_PRIMARY primary key (id), constraint PLAY_EPISODEID_FOREIGN foreign key (episode_id) references Episode(id) ) create unique index PLAY_ORDR_UNIQUE on Play(episode_id,ordr); 表结构是这样的 |
2
Red998 2023-01-03 20:53:34 +08:00
看到就头疼、为什么要用注解 Results 呢 直接写 xml 写 sql 不是更简单 。简单直观
|
3
77yf77yf77yf OP @redorblacck886 我用注解更加习惯一点吧
这个获取到的 episode 对象中 id 为 null,但是后面的 play 对象是根据传过去的 episode id 查出来的,照理来说肯定有,但是就是不知道为什么没有放进对象里 |
4
L0L 2023-01-03 21:37:19 +08:00
```java
@Select("select * from Episode t where t.anime_id = #{anime_id} order by t.ordr") @Results({ @Result(column = "anime_id", property = "animeId"), @Result(column = "image_path", property = "imagePath"), @Result(many = @Many(select = "org.watp.anifree.anime.dao.AnimeMapper.getSynthesizePlaysInfoByEpisodeId"), property = "plays", column = "id", javaType = ArrayList.class) }) List<EpisodePO> getSynthesizeEpisodesInfoByAnimeId(@Param("anime_id") String anime_id); ``` 是不是第二条关联语句中的 `column = "anime_id"` 这样呢? 实际是三个表的依次 JOIN 操作,猜测是你第二个语句中实际是没有 column 为 id 的这一列的原因 |
5
77yf77yf77yf OP @L0L 加了个 id 的 Result 还真的有了,感谢大佬
不是应该实体类和列的名称相同可以自动映射吗,为什么这里需要手写一下,而下面那个 Play 的 id 就不用手写就有,向大佬请教一下 |
6
L0L 2023-01-03 21:54:07 +08:00
@77yf77yf77yf 这块可以 debug 看一下,我记得自动映射在 xml 里可以使用双引号实现;注解的方式平常用的比较少,如果是对比 xml 中 resultMap 的标签形式的话,其实你第二个语句实际相当于只使用了你定义的几个 Result 注解的字段,而其他的框架并没有使用,也就没有映射了;
|
7
L0L 2023-01-03 21:54:21 +08:00
V 友多说一嘴,一般如果是应用工程中的代码的话,` select * ` 的这种写法尽量还是避免,用到什么写什么,对于后续扩展表的字段结构甚至是查询速度来说,都会有一些提升。
|