feat: add lambda query

This commit is contained in:
开源海哥 2023-06-08 18:31:13 +08:00
parent 232a25776a
commit 71bca6c6ee
4 changed files with 83 additions and 16 deletions

View File

@ -15,6 +15,8 @@
*/
package com.mybatisflex.core.query;
import java.util.function.Consumer;
/**
* @author michael yang (fuhai999@gmail.com)
* @Date: 2020/1/14
@ -43,5 +45,12 @@ public class Joiner<M> {
join.on(on);
return queryWrapper;
}
public M on(Consumer<QueryWrapper> consumer) {
QueryWrapper newWrapper = new QueryWrapper();
consumer.accept(newWrapper);
join.on(newWrapper.whereQueryCondition);
return queryWrapper;
}
}

View File

@ -15,16 +15,19 @@
*/
package com.mybatisflex.core.query;
import com.mybatisflex.core.util.LambdaGetter;
import com.mybatisflex.core.util.LambdaUtil;
import java.util.Collection;
import java.util.function.Predicate;
public class LambdaConditionBuilder {
public class QueryConditionBuilder {
private QueryWrapper queryWrapper;
private QueryColumn queryColumn;
private SqlConnector connector;
public LambdaConditionBuilder(QueryWrapper queryWrapper, QueryColumn queryColumn, SqlConnector connector) {
public QueryConditionBuilder(QueryWrapper queryWrapper, QueryColumn queryColumn, SqlConnector connector) {
this.queryWrapper = queryWrapper;
this.queryColumn = queryColumn;
this.connector = connector;
@ -51,6 +54,16 @@ public class LambdaConditionBuilder {
}
public <T> QueryWrapper eq(LambdaGetter<T> value) {
return eq(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper eq(LambdaGetter<T> value, Predicate<T> when) {
return eq(LambdaUtil.getQueryColumn(value), when);
}
/**
* not equals !=
*
@ -70,6 +83,15 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper ne(LambdaGetter<T> value) {
return ne(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper ne(LambdaGetter<T> value, Predicate<T> when) {
return ne(LambdaUtil.getQueryColumn(value), when);
}
/**
* like %%
@ -139,6 +161,16 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper gt(LambdaGetter<T> value) {
return gt(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper gt(LambdaGetter<T> value, Predicate<T> when) {
return gt(LambdaUtil.getQueryColumn(value), when);
}
/**
* 大于等于 greater or equal
*
@ -158,6 +190,15 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper ge(LambdaGetter<T> value) {
return ge(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper ge(LambdaGetter<T> value, Predicate<T> when) {
return ge(LambdaUtil.getQueryColumn(value), when);
}
/**
* 小于 less than
*
@ -177,6 +218,15 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper lt(LambdaGetter<T> value) {
return lt(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper lt(LambdaGetter<T> value, Predicate<T> when) {
return lt(LambdaUtil.getQueryColumn(value), when);
}
/**
* 小于等于 less or equal
*
@ -189,6 +239,7 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper le(Object value, Predicate<T> when) {
if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector);
@ -196,6 +247,15 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper le(LambdaGetter<T> value) {
return le(LambdaUtil.getQueryColumn(value));
}
public <T> QueryWrapper le(LambdaGetter<T> value, Predicate<T> when) {
return le(LambdaUtil.getQueryColumn(value), when);
}
/**
* IS NULL
@ -365,6 +425,7 @@ public class LambdaConditionBuilder {
return queryWrapper;
}
public <T> QueryWrapper between(Object start, Object end, Predicate<T> when) {
if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector);

View File

@ -137,8 +137,8 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this;
}
public <T> LambdaConditionBuilder where(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
public <T> QueryConditionBuilder where(LambdaGetter<T> fn) {
return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
}
public QueryWrapper and(QueryCondition queryCondition) {
@ -155,8 +155,8 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this;
}
public <T> LambdaConditionBuilder and(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
public <T> QueryConditionBuilder and(LambdaGetter<T> fn) {
return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
}
@ -184,6 +184,10 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this;
}
public <T> QueryConditionBuilder or(LambdaGetter<T> fn) {
return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.OR);
}
public QueryWrapper or(Consumer<QueryWrapper> consumer) {
QueryWrapper newWrapper = new QueryWrapper();
consumer.accept(newWrapper);
@ -194,11 +198,6 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this;
}
public <T> LambdaConditionBuilder or(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.OR);
}
public Joiner<QueryWrapper> leftJoin(String table) {
return joining(Join.TYPE_LEFT, new QueryTable(table), true);
}

View File

@ -26,9 +26,6 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource;
import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT;
import static com.mybatisflex.test.table.ArticleTableDef.ARTICLE;
public class EntityTestStarter {
public static void main(String[] args) {
@ -117,8 +114,9 @@ public class EntityTestStarter {
// , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge)
// , ACCOUNT.BIRTHDAY
// )
.from(ARTICLE)
.leftJoin(ACCOUNT).as("a").on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID))
.from(Article.class)
// .leftJoin(Account.class).as("a").on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID))
.leftJoin(Account.class).as("a").on(s -> s.where(Account::getId).eq(Article::getAccountId))
.where(Account::getId).ge(100, If::notEmpty)
.and(queryWrapper -> {
queryWrapper