1、单条件查询
// 查询 firstName 叫做 “joe”的人
List joes = userBox.query()
.equal(User_.firstName, "Joe")
.build()
.find();
2、多条件查询
// 获得名“Joe”的用户,这些用户出生于1970年以后,姓以“O”开头。
QueryBuilder builder = userBox.query();
builder.equal(User_.firstName, "Joe")
.greater(User_.yearOfBirth, 1970)
.startsWith(User_.lastName, "O");
List youngJoes = builder
.build()
.find();
3、其他条件
equal()、notEqual()、 greater() 、less()
isNull() and notNull(),
between():过滤给定两个值之间的值
mStuBox.query().between(Student_.age,18,20)
String[] names =new String[]{"小明","小米"};
mStuBox.query().in(Student_.name, names,QueryBuilder.StringOrder.CASE_SENSITIVE);
按升序排列,忽略大小写
userBox.query().equal(User_.firstName, "Joe")
.order(User_.lastName) // 按升序排列,忽略大小写
.find();
以降序和区分大小写的方式
// QueryBuilder.DESCENDING :降序
// QueryBuilder.CASE_SENSITIVE :区分大小写
userBox.query().equal(User_.firstName, "Joe")
.order(User_.lastName, QueryBuilder.DESCENDING | QueryBuilder.CASE_SENSITIVE)
.find();
1、find
返回与查询匹配的所有实体
List joes = query.find();
只返回第一个结果
User joe = query.findFirst();
如果您想要一个唯一的结果调用findUnique()。如果没有找到匹配的实体,它将给您一个结果或null,如果有多个结果,则抛出异常。
User joe = query.findUnique();
2、复用query 和参数
初始化 query ,查询条件 暂无:备用 query
// build query
Query query = userBox.query().equal(User_.firstName, "").build();
具体实际查询:
// change firstName parameter to "Joe", get results
List joes = query.setParameter(User_.firstName, "Joe").find();
...
// change firstName parameter to "Jake", get results
List jakes = query.setParameter(User_.firstName, "Jake").find();
对firstName 属性设置多个查询条件时:
Query query = userBox.query()
.equal(User_.firstName, "").parameterAlias("name");
List joes = query.setParameter("name", "Joe").find();
3、限制、分页、偏移查询
// 从 第5个开始(不含第五个),查询 之后的10个
List stuList = mStuBox.query().equal(Student_.name, "张三")
.build()
.find(5, 10);
4、懒加载查询结果
query提供findLazy()和findLazyCached(),它们返回查询结果的LazyList。
LazyList 是一个线程安全的、不可修改的列表,只有在实体被访问时才会懒洋洋地读取它们。根据所调用的find方法,延迟列表是否会被缓存。缓存的惰性列表存储以前访问过的对象,以避免多次加载实体。列表的一些特性仅限于缓存列表(例如,需要整个列表的特性)。
List stuList = mStuBox.query().equal(Student_.name, "小明")
.build()
.findLazy();
如果您只想返回某个属性的值,而不是完整对象的列表,那么可以使用PropertyQuery。
// 返回第一个值
int age = mStuBox.query()
.build()
.property(Student_.age)
.findInt();
// 返回所有值
int[] ages = mStuBox.query()
.build()
.property(Student_.age)
.findInts();
注意:返回的属性值数组没有任何特定的顺序,即使您在构建查询时指定了顺序。
1、处理属性为 null 值
默认情况下,不返回空值。但是,如果属性为空,您可以指定要返回的替换值:
// returns 'unknown' if email is null
String[] emails = userBox.query().build()
.property(User_.email)
.nullValue("unknown")
.findStrings();
2、查询唯一结果
// returns 'joe'
String[] names = userBox.query().build()
.property(User_.firstName)
.distinct()
.findStrings();
// returns 'Joe', 'joe', 'JOE'
String[] names = userBox.query().build()
.property(User_.firstName)
.distinct(StringOrder.CASE_SENSITIVE)
.findStrings();
3、聚合数据
Property queries(JavaDoc)还提供聚合函数,直接计算所有找到的值的最小值、最大值、平均值、和和计数:
年龄求和
long allAges = mStuBox.query()
.build()
.property(Student_.age)
.sum();
由于ObjectBox不是SQL数据库, 使用 link 能使不同表数据实体进行关联查询。
// 获得 学生姓名为:小明 ,课程名称为:语文的 所有课程
QueryBuilder stuBuilder = mStuBox.query()
.equal(Student_.name, "小明0");
List courses =stuBuilder
.link(Student_.courses)
.equal(Course_.courseName, "语文")
.build().find();
// 获得 学习课程名称为 :语文 ,学生姓名为:小明0 所有学生
Box courseBox = ((App) getApplication()).getBoxStore()
.boxFor(Course.class);
QueryBuilder couBuilder = courseBox.query()
.equal(Course_.courseName, "语文");
List students = couBuilder.backlink(Student_.courses)
.equal(Student_.name, "小明0")
.build()
.find();