Room数据库如何将checkCovid返回的用户ID列表传入selectCovidPlace查询
解决方法
你可以通过Room原生支持的IN查询语法实现批量ID传参,同时修正现有方法的不合理定义即可:
1. 修正checkCovid方法返回类型
当前查询语句仅返回UserID字段,不需要返回完整USER实体,直接返回ID列表降低性能损耗:
// 如果你的UserID字段是Long类型,把返回值改为List<Long>即可 @Query("SELECT distinct UserID FROM USER WHERE CovidStat=='T'") public List<Integer> checkCovid();
2. 改造selectCovidPlace支持批量ID查询
你原方法返回值为int不符合查询逻辑,因为你要获取PID和VisitDate两个字段,还可能返回多条记录,需要先定义对应POJO类接收结果:
// 结果映射类,字段名和查询返回的字段名保持一致即可 public class VisitRecord { public int PID; public String VisitDate; // 也可以根据存储格式改为Date/时间戳Long类型 }
修改DAO查询方法,支持传入ID列表:
// 用IN关键字匹配列表参数,原关联USER表的逻辑可以去掉,因为你拿到的ID已经是合法的确诊用户ID @Query("SELECT DISTINCT PID,VisitDate FROM USER_PLACE WHERE UID IN (:uidList)") public List<VisitRecord> selectCovidPlaces(List<Integer> uidList);
3. 业务调用逻辑
// 第一步:查询所有确诊用户ID List<Integer> covidUidList = userDao.checkCovid(); if (!covidUidList.isEmpty()) { // 第二步:批量传入ID查询所有关联到访记录 List<VisitRecord> allCovidVisitRecords = userDao.selectCovidPlaces(covidUidList); // 处理查询结果即可 }
注:SQLite默认对IN语句的参数数量限制为999个,如果你的确诊用户量级超过这个数值,可以把ID列表拆分成分批查询,每批最多999个ID即可。
内容的提问来源于stack exchange,提问作者Dream
相关产品推荐
相关产品推荐

