Java Web端Firebase如何将Firestore查询结果集转List对象
Firestore toObjects() 方法正确调用方式
针对你使用的firebase-admin 7.0.1版本Java SDK(非Android环境),转换查询结果到实体类集合的步骤如下:
1. 先修正实体类的基础写法
你给出的实体类有基础语法问题,且要满足Firestore默认序列化规则:
- 类修饰符用小写
public,不能大写 - 必须保留无参公共构造方法,否则反序列化会失败
- 实体类属性名要和Firestore文档的字段名完全对应,不需要额外加注解
示例实体类代码:
public class ClassName { // 属性和Firestore存储的字段名一一对应 private String column1; private String column2; // 其他业务字段... // 必须显式声明无参构造(如果没写任何带参构造,默认会有,写了带参构造就必须手动加) public ClassName() {} // 所有属性生成对应的getter、setter public String getColumn1() { return column1; } public void setColumn1(String column1) { this.column1 = column1; } public String getColumn2() { return column2; } public void setColumn2(String column2) { this.column2 = column2; } // 其余字段的getter、setter省略 }
2. 正确传参调用toObjects()
toObjects()方法需要传入的参数就是目标实体类的Class对象,你之前的代码里还有变量名笔误(打印size时写的piFutureResults和定义的apiFutureResults不一致),修正后的完整转换代码:
Query query = dbFirestore.collection("collectionName") .whereEqualTo("column1", "value") .whereEqualTo("column2", "value"); ApiFuture<QuerySnapshot> apiFutureResults = query.get(); // 拿到查询结果快照 QuerySnapshot snapshot = apiFutureResults.get(); System.out.println("Document size..." + snapshot.getDocuments().size()); // 传入实体类的class对象,直接得到对应类型的集合,不需要强转 List<ClassName> classNameList = snapshot.toObjects(ClassName.class);
注意事项
- 不要用通配符
?声明List泛型,直接指定你的实体类类型即可,方法返回值本身就是泛型化的,会自动匹配类型,不需要额外强转 - 只有当实体类属性名和Firestore存储的字段名不一致时,才需要在对应属性上加
@PropertyName("实际字段名")注解做映射,名字完全一致的话不需要加任何额外注解 - 调用
ApiFuture.get()时需要捕获InterruptedException、ExecutionException等异常,做好业务侧的异常处理 - 该写法在非Android的Java Web环境下可正常运行,和你当前使用的firebase-admin 7.0.1版本完全兼容
内容的提问来源于stack exchange,提问作者aarav
相关产品推荐
相关产品推荐

