我根据歌单id查询歌单列表中歌曲信息,得到了返回出来的实体列表,想要提取出其中的一个字段,为song_id。用了get,但是没有出来。
/**
* 根据歌单id查询歌单列表中歌曲信息(不是Song实体)
*/
@ApiOperation("根据歌单id查询歌曲")
@GetMapping(value = "/detail")
@ApiImplicitParam(name = "songListId",value = "歌单id")
public Object detail(HttpServletRequest request){
String songListId = request.getParameter("songListId");
List<SongListSingle> listSingles = songListSingleService.listSongOfSongListId(Integer.parseInt(songListId));
listSingles.get(0);
return listSingles;
}
下面是postMan 得到的值
下面是数据库的值
我就想从其中提取出song_id列表,再去数据库查询song_id另一张表的数据出来
1、你的xml文件中返回值类型不对,sql语句写的应该也不对,如果你想返回song_id的list,那么需要如下操作
注意:我只是根据你的代码,推导出你的文件中的方法接口名称,不一定正确,以你的实际为准,你只需要注意返回值由
list<SongListSingle> 改为 List<Integer>,另外再注意一下xml文件中的SQL语句,主要注意返回值resultType="java.lang.Integer"和select 语句
controller中,
List<SongListSingle> listSingles = songListSingleService.listSongOfSongListId(Integer.parseInt(songListId));
改为
List<Integer> listSingles = songListSingleService.listSongOfSongListId(Integer.parseInt(songListId));
service中
List<SongListSingle> .listSongOfSongListId(Integer songListId );
改为
List<Integer> .listSongOfSongListId(Integer songListId );
serviceImple中也对应修改
mapper.java中
List<SongListSingle> .listSongOfSongListId(@Param("songListId") Integer songListId );
改为
List<Integer> .listSongOfSongListId(@Param("songListId") Integer songListId );
mapper.xml中SQL语句
<select id="listSongOfSongListId" resultType="java.lang.Integer">
select song_id from song_list_single where song_list_id = #{songListId}
</select>
mybatis配置里看看数据库查询的返回值类型
得到数组中的第一个值并将第一个值返回即可
public class SongTest {
public static void main(String[] args) {
//模拟表数据
SongListSingle songListSingle1 = SongListSingle.builder().id("1").songId("1").songListId("1").build();
SongListSingle songListSingle2 = SongListSingle.builder().id("2").songId("2").songListId("1").build();
SongListSingle songListSingle3 = SongListSingle.builder().id("3").songId("3").songListId("1").build();
//模拟取出List数据
List<SongListSingle> listSingles = Arrays.asList(songListSingle1,songListSingle2,songListSingle3);
//遍历List数据,取出想要的字段
listSingles.forEach((s)->System.out.println("song_id : " + s.getSongId()));
//你的代码:
//String songListId = request.getParameter("songListId");
//List<SongListSingle> listSingles = songListSingleService.listSongOfSongListId(Integer.parseInt(songListId));
//取出第一个数据要复制给一个对象
if(!listSingles.isEmpty()){
SongListSingle songListSingle = listSingles.get(0);
String songId = songListSingle.getSongId();
System.out.println("song_id-0: " + songId);
}
}
}
@Data
@Builder
public class SongListSingle {
private String id;
private String songId;
private String songListId;
}
把你的返回值写成
return listSingles;
改成
return listSingles.get(0);
如果要拿list中的第一个对象的songId的值,就改成
return listSingles.get(0).getSongId();
根据你图片上的内容,我可以得到你接口返回的是一个对象的list,你想得到list中所有对象的ID,你仿照我这个代码改一下controller中的处理逻辑,接口返回id的list
public void testListGetList() {
List<SysUser> list = new ArrayList<>();
SysUser king = new SysUser();
king.setId("1");
king.setUserName("King");
king.setPassword("123");
SysUser queen = new SysUser();
queen.setId("2");
queen.setUserName("queen");
queen.setPassword("123");
SysUser jack = new SysUser();
jack.setId("3");
jack.setUserName("jack");
jack.setPassword("123");
list.add(king);
list.add(queen);
list.add(jack);
List<String> result = list.stream().map(sysUser -> sysUser.getId()).collect(Collectors.toList());
System.out.println(JSON.toJSONString(result));
}
根据您提供的信息,你不希望更改其他配置的前提下,在控制层使用最少的代码来解决ID抽取功能。一般业务场景中这种情况也是很常见的,获取这个对象列表是当前业务模块必须的,那么抽取IDs则是附加的业务,因此您只是不想增加额外的数据库查询开销,来直接抽取这些IDs。Java8中提供的Stream流可以很好的解决您的问题,如果我的理解是对的,一行代码即可搞定:
list.stream().map(Student::getId)
private static void test(){
List<Student> list = new ArrayList<>();
list.add(new Student(0, "A"));
list.add(new Student(1, "B"));
list.add(new Student(2, "C"));
list.add(new Student(3, "D"));
List<Integer> ids = list.stream().map(Student::getId).collect(Collectors.toList());
Object[] objects = list.stream().map(Student::getId).toArray();
System.out.println(Arrays.toString(objects));
}