如何使用.compare对返回列表的实体属性实现查询预过滤
解决方案
核心问题根因
你自行编写的代码未生效,是因为ZoneList()是Region实体的封装方法,不属于数据库映射的存储字段,无法直接通过.compare()转化为SQL层面的过滤条件,必须直接操作数据库层面关联的邮编存储属性来实现预过滤。
优化后代码(适配标准关联存储场景)
假设你Region实体下存储邮编列表的关联子表映射属性为ZipCodes(即ZoneList()方法实际读取的数据源),代码可修正为:
zipUsers = Query.make(entity.URegn) // 关联URegn指向的Region外键表 .join("Region") // 关联Region下存储邮编的子表,替换为你实际的关联属性名 .join("Region.ZipCodes") // 数据库层直接匹配目标邮编,提前过滤数据 .compare("Region.ZipCodes.Code", Equals, ZipCode) // 把用户激活状态判断也提前到查询阶段,减少内存加载量 .join("User") .join("User.Credential") .compare("User.Credential.Active", Equals, true) .select() .toSet()*.User
如果你实际使用的实体名为
UserRegion,把第一行的entity.URegn替换为entity.UserRegion即可。
优化说明
- 所有
.join()和.compare()逻辑都会转化为SQL语句在数据库端执行,只有符合条件的少量数据会加载到内存,相比原来的全量拉取后内存过滤效率提升明显 - 移除了原逻辑中内存层面的
where和hasMatch判断,全部查询逻辑下沉到数据库层执行 - 如果你Region的邮编是用单个字段存储的多值(比如逗号分隔字符串),可以去掉关联邮编子表的逻辑,直接用
.compare("Region.存储邮编的字段名", Contains, ZipCode)做匹配即可。
内容的提问来源于stack exchange,提问作者Connor D
相关产品推荐
相关产品推荐

