查询条件构造器
# LambdaEsQueryWrapper
提示
此条件构造器主要用于查询数据时所需查询条件的封装
# allEq
allEq(Map<R, V> params)
2
全部eq
个别参数说明
params : key为数据库字段名,value为字段值
- 例: allEq({id:1,name:"老王",age:18})--->id = 1 and name = '老王' and age = 18
allEq(BiPredicate<R, V> filter, Map<R, V> params)
2
个别参数说明
filter : 过滤函数,是否允许字段传入比对条件中 params 与 null2IsNull : 同上
- 例: allEq((k,v) -> k.indexOf("a") >= 0, {id:1,name:"老王",age:18})--->name = '老王' and age = 18
# eq
eq(R column, Object val)
eq(boolean condition, R column, Object val)
2
- 等于 =
- 例: eq("name", "老王")--->name = '老王'
# gt
gt(R column, Object val)
gt(boolean condition, R column, Object val)
2
- 大于 >
- 例: gt("age", 18)--->age > 18
# ge
ge(R column, Object val)
ge(boolean condition, R column, Object val)
2
- 大于等于 >=
- 例: ge("age", 18)--->age >= 18
# lt
lt(R column, Object val)
lt(boolean condition, R column, Object val)
2
- 小于 <
- 例: lt("age", 18)--->age < 18
# le
le(R column, Object val)
le(boolean condition, R column, Object val)
2
- 小于等于 <=
- 例: le("age", 18)--->age <= 18
# between
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
2
- BETWEEN 值1 AND 值2
- 例: between("age", 18, 30)--->age between 18 and 30
# like
like(R column, Object val)
like(boolean condition, R column, Object val)
2
- LIKE '%值%'
- 例: like("name", "王")--->name like '%王%'
# likeLeft
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
2
- LIKE '%值'
- 例: likeLeft("name", "王")--->name like '%王'
# likeRight
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
2
- LIKE '值%'
- 例: likeRight("name", "王")--->name like '王%'
# isNotNull
isNotNull(R column)
isNotNull(boolean condition, R column)
2
- 字段 IS NOT NULL
- 例: isNotNull(Document::getTitle)--->title is not null
# exists
exists(R column)
exists(boolean condition, R column)
2
效果和功能等价于上面的isNotNull,主要是为了照顾es原生语法习惯的用户
# in
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
2
- 字段 in (value.get(0), value.get(1), ...)
- 例: in("age",{1,2,3})--->age in (1,2,3)
in(R column, Object... values)
in(boolean condition, R column, Object... values)
2
- 字段 in (v0, v1, ...)
- 例: in("age", 1, 2, 3)--->age in (1,2,3)
# groupBy
groupBy(R... columns)
groupBy(boolean condition, R... columns)
2
- 分组:GROUP BY 字段, ...
- 例: groupBy(Document::getId,Document::getTitle)--->group by id,title
# orderByDesc
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
2
- 排序:ORDER BY 字段, ... DESC
- 例: orderByDesc(Document::getId,Document::getTitle)--->order by id DESC,title DESC
# limit
limit(Integer n);
limit(Integer m, Integer n);
2
3
- limit n 最多返回多少条数据,相当于MySQL中limit n 中的n,用法一致.
- limit m,n 跳过m条数据,最多返回n条数据,相当于MySQL中的limit m,n 或 offset m limit n
- 例: limit(10)--->最多只返回10条数据
- 例: limit(2,5)--->跳过前2条数据,从第3条开始查询,总共查询5条数据
温馨提示
n参数若不指定,则其默认值是10000 如果你单次查询超过1W条,建议采用分页(参考后面分页章节),万不得已非要在这里指定超过1w,比如指定2w,需要在查询的实体类上加上注解@IndexName(maxResultWindow=20000) 指定其maxResultWindow,并重建索引,否则es会报错,这是es的规则,它作此限制应该是为了保护你的内存防止溢出. 如果你单次查询,不想要太多得分较低的数据,需要手动指定n去做限制. 另外此参数作用与Es中的size,from一致,只是为了兼容MySQL语法而引入,使用者可以根据自身习惯二选一,当两种都用时,只有一种会生效,后指定的会覆盖先指定的.
# from
from(Integer from)
- 从第几条数据开始查询,相当于MySQL中limit (m,n)中的m.
- 例: from(10)--->从第10条数据开始查询
# size
size(Integer size)
- 最多返回多少条数据,相当于MySQL中limit (m,n)中的n 或limit n 中的n
- 例: size(10)--->最多只返回10条数据
温馨提示
如果你单次查询,不想要太多得分较低的数据,需要手动指定size去做限制.
# minScore
minScore(Float score)
- 查询得分不低于score的数据,如果得分低于此值,则不被命中
# trackScores
trackScores();
- 开启计算得分 默认值为关闭状态 查询得分可以用于排序等场景
# index
index(String indexName)
index(boolean condition, String indexName)
2
温馨提示
可通过wrapper.index(String indexName)指定本次查询作用于哪个索引,如果本次查询要从多个索引上查询,那么索引名称可以用逗号隔开,例如wrapper.index("index1","indexe2"...) wrapper中指定的索引名称优先级最高,如果不指定则取实体类中配置的索引名称,如果实体类也未配置,则取实体名称小写作为当前查询的索引名 针对insert/delete/update等接口中无wrapper的情况,如果你需要指定索引名,可直接在对应接口的入参中添加索引名称,可参考下面示例:
Document document = new Document();
// 省略为document赋值的代码
String indexName = "laohan";
insert(document,indexName);
2
3
4
# and
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
2
- AND
- 例: and(i -> i.eq(Document::getTitle, "Hello").eq(Document::getCreator, "Guy"))--->and (title ='Hello' and creator = 'Guy' )
# or
or()
or(boolean condition)
2
- 拼接 OR 注意事项: 主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)
- 例: eq("Document::getId",1).or().eq(Document::getTitle,"Hello")--->id = 1 or title ='Hello'
or(Consumer<Param> consumer)
or(boolean condition, Consumer<Param> consumer)
2
嵌套 OR
例: or(i -> i.eq(Document::getTitle, "Hello").ne(Document::getCreator, "Guy"))--->or (title ='Hello' and status != 'Guy' )
特殊情况
例: eq(Document::getTitle,"Hello") .and(i->i.eq(Document::getCreator,"Bob").or().eq(Document::getCreator,"Tom"))---> title="Hello" and(creator="Bob" or creator="Tom")
# filter
and和filter的选择,它们在功能上类似,都是表示必须满足的条件,不同之处在于filter不计算得分,性能表现更好,但不支持根据得分排序.
filter()
filter(boolean condition)
2
- 拼接 filter 注意事项: 主动调用filter表示紧接着下一个方法不是用and连接!(不调用filter则默认为使用and连接)
- 例: eq("Document::getId",1).filter().eq(Document::getTitle,"Hello")--->id = 1 and title ='Hello'
filter(Consumer<Param> consumer)
filter(boolean condition, Consumer<Param> consumer)
2
- 嵌套 filter
- 例: filter(i -> i.eq(Document::getTitle, "Hello").eq(Document::getCreator, "Guy"))--->or (title ='Hello' and status = 'Guy' )
# not
not()
not(boolean condition)
2
- 拼接 not 注意事项: 主动调用not表示紧接着下一个方法不是用and连接!(不调用not则默认为使用and连接)
- 例: eq("Document::getId",1).not().eq(Document::getTitle,"Hello")--->id = 1 and title !='Hello'
filter(Consumer<Param> consumer)
filter(boolean condition, Consumer<Param> consumer)
2
- 嵌套 not
- 例: not(i -> i.eq(Document::getTitle, "Hello").eq(Document::getCreator, "Guy"))---> (title !='Hello' and status != 'Guy' )
# nested
nested(String path, Consumer<Param> consumer)
nested(String path, Consumer<Param> consumer, ScoreMode scoreMode)
nested(boolean condition, String path, Consumer<Param> consumer)
nested(boolean condition, String path, Consumer<Param> consumer, ScoreMode scoreMode)
2
3
4
- 嵌套查询 nested
- 例: wrapper.nested("users.faqs", i ->i.eq(question,"问题") ---> from faq where question = '问题' 使用场景仅限于嵌套类型的查询,关于嵌套类型和父子类型后面高阶语法中会有单独的章节来讲,此处仅简单列一下.