ObjectBox入门-8-查询
HumphreyDanobjectbox
Queries
- 使用 QueryBuilder 定义查询标准,Query 类运行查询并返回匹配结果
QueryBuilder
- QueryBuilder 使用编译生成的元信息类来指定要匹配的属性值。
1 | List<user> joes = userBox.query().equal(User_.firstName,"Joe").build().find(); |
边界条件
equal(),notEqual(),greater(),less()
isNull(),notNull()
between()
in(),notIn()
startsWith(),endsWith(),contains()
and(),or()
排序
1 | userBox.query().equal(User_.firstName,"Joe") |
Query
1 | Query<User> query = builder. build(); |
- 如果是不断的执行 Query,那么应该缓存 Query 对象,重复使用。为了复用 Query 对象,可以改变它的属性值,或查询参数,或添加的各种边界条件。
1
2
3
4
5// 假设已经构建了一个 Query 对象,但是为了后面复用,此处 equal 边界条件的值设置为 ""
Query<User> query = userBox.query().equal(User_.firstName,"").build();
// 接下来可以根据具体情况改变参数值
List<User> joes = query.setParameter(User_.firstName,"Joe").find();
List<User> jakes = query.setParameter(User_.firstName,"Jake").find(); - 如果是多个边界条件,可以在边界条件后给每一个参数设置一个别名
1 | // 给 equal() 查询参数设置 name 别名 |
Limit,Offset,Pagination
1 | Query<User> query = userBox.query().equal(User_.firstName,"Joe").build(); |
延迟加载
findLazy(),findLazyCached()
返回LazyList
查询结果。LazyList
是线程安全的,不可修改的只读 list,只有在访问时才会加载数据。缓存 LazyList 可以保留之前访问过的数据以避免重复加载。
删除
query.remove()
删除所有匹配的结果
属性查询
如果只想返回某个指定属性的值而不是匹配的全部对象列表,那么请使用 PropertyQuery
.在构建 query 后调用 property(Property)
即可
1 | String[] emails = userBox.query().build() |
findString()
返回第一条结果,findStrings()
返回所有结果- 返回的是没有排序的结果,即使在构建 query 时指定了排序规则.
处理 null 值
默认不返回 null 值。如果属性为 null,可以指定一个替代返回值
1 | // 如果 email 为 null,返回 unknown |
distinct,unique
1 | // 返回 ‘joe' |
默认 strings 忽略大小写。当然可以定制
1 | // 返回 'joe' 'Joe' 'JOE' |
只查询一个值,没有则抛出异常
1 | String[] names = userBox.query().build().equal(User_.isAdmin, true) |
- distinct 和 unique 可以组合
统计
属性查询同时提供了统计函数。
min(),minDouble()
max(),maxDouble()
sum,sumDouble()
: sum() 可能溢出并抛出异常avg()
: 返回 doublecount()
: 比查询到对象列表然后求列表长度要快。可以和 distinct() 组合
为关联属性添加查询条件
创建关联属性后,可能想为只存在于关联 entity 的属性添加查询条件。SQL 中使用 JOIN.
1 |
|
查询住在指定街道(Address)的 xxx(Person)。可以使用link(RelationInfo
1 | // 获取所有名为 elmo 的对象 |
如果想获取到 Address 列表呢?那么可以在 Address 中添加 @Backlint 注解
1 |
|
当然,也可以不用修改 Address,使用 backlink(RelationInfo)
即可实现查询
1 | val builder = box.query().equal(Address_.street,"Sesame Street"); |
关系属性的激进加载
默认关系属性是懒加载的。第一次访问 ToOne ,ToMany 属性时会到数据库中查询数据,然后都会使用缓存过的数据。
1 | val customers = customerBox.query().build().find() |
如果想在查询结果返回时实现预读取 ToOne,ToMany 数据,请使用 QueryBuilder.eager
1 | val customers = customerBox.query() |
eager 加载仅支持一层深度。如果有嵌套的关联层级,可以使用下面的 query filter 实现。
query filters
应用于复杂的边界条件,QueryBuilder 类不能实现。使用如下规则将会非常高效:
- 使用标准的数据库边界条件缩小目标范围。(使用 QueryBuilder 获取目标)
- 然后使用 QueryFilter 过滤
QueryFilter 一次检查一个目标对象,符合返回 true
1 | // 缩小范围 |
关注一下性能:
- ObjectBox 创建对象非常快
- 虚拟机会回收短期对象。
此处回收将比创建快,所以性能不是问题。
query filters 和 ToMany
ToMany 提供了很多函数可以方便的转为 query filters:
hasA
hasAll
getById
评论
匿名评论隐私政策