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; package com.mybatisflex.core.query;
import java.util.function.Consumer;
/** /**
* @author michael yang (fuhai999@gmail.com) * @author michael yang (fuhai999@gmail.com)
* @Date: 2020/1/14 * @Date: 2020/1/14
@ -43,5 +45,12 @@ public class Joiner<M> {
join.on(on); join.on(on);
return queryWrapper; 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; package com.mybatisflex.core.query;
import com.mybatisflex.core.util.LambdaGetter;
import com.mybatisflex.core.util.LambdaUtil;
import java.util.Collection; import java.util.Collection;
import java.util.function.Predicate; import java.util.function.Predicate;
public class LambdaConditionBuilder { public class QueryConditionBuilder {
private QueryWrapper queryWrapper; private QueryWrapper queryWrapper;
private QueryColumn queryColumn; private QueryColumn queryColumn;
private SqlConnector connector; private SqlConnector connector;
public LambdaConditionBuilder(QueryWrapper queryWrapper, QueryColumn queryColumn, SqlConnector connector) { public QueryConditionBuilder(QueryWrapper queryWrapper, QueryColumn queryColumn, SqlConnector connector) {
this.queryWrapper = queryWrapper; this.queryWrapper = queryWrapper;
this.queryColumn = queryColumn; this.queryColumn = queryColumn;
this.connector = connector; 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 != * not equals !=
* *
@ -70,6 +83,15 @@ public class LambdaConditionBuilder {
return queryWrapper; 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 %% * like %%
@ -139,6 +161,16 @@ public class LambdaConditionBuilder {
return queryWrapper; 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 * 大于等于 greater or equal
* *
@ -158,6 +190,15 @@ public class LambdaConditionBuilder {
return queryWrapper; 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 * 小于 less than
* *
@ -177,6 +218,15 @@ public class LambdaConditionBuilder {
return queryWrapper; 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 * 小于等于 less or equal
* *
@ -189,6 +239,7 @@ public class LambdaConditionBuilder {
return queryWrapper; return queryWrapper;
} }
public <T> QueryWrapper le(Object value, Predicate<T> when) { public <T> QueryWrapper le(Object value, Predicate<T> when) {
if (value != null) { if (value != null) {
queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector); queryWrapper.addWhereQueryCondition(queryColumn.le(value, when), connector);
@ -196,6 +247,15 @@ public class LambdaConditionBuilder {
return queryWrapper; 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 * IS NULL
@ -365,6 +425,7 @@ public class LambdaConditionBuilder {
return queryWrapper; return queryWrapper;
} }
public <T> QueryWrapper between(Object start, Object end, Predicate<T> when) { public <T> QueryWrapper between(Object start, Object end, Predicate<T> when) {
if (queryWrapper != null) { if (queryWrapper != null) {
queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector); queryWrapper.addWhereQueryCondition(queryColumn.between(start, end, when), connector);

View File

@ -137,8 +137,8 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this; return this;
} }
public <T> LambdaConditionBuilder where(LambdaGetter<T> fn) { public <T> QueryConditionBuilder where(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND); return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
} }
public QueryWrapper and(QueryCondition queryCondition) { public QueryWrapper and(QueryCondition queryCondition) {
@ -155,8 +155,8 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this; return this;
} }
public <T> LambdaConditionBuilder and(LambdaGetter<T> fn) { public <T> QueryConditionBuilder and(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND); return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.AND);
} }
@ -184,6 +184,10 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this; return this;
} }
public <T> QueryConditionBuilder or(LambdaGetter<T> fn) {
return new QueryConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.OR);
}
public QueryWrapper or(Consumer<QueryWrapper> consumer) { public QueryWrapper or(Consumer<QueryWrapper> consumer) {
QueryWrapper newWrapper = new QueryWrapper(); QueryWrapper newWrapper = new QueryWrapper();
consumer.accept(newWrapper); consumer.accept(newWrapper);
@ -194,11 +198,6 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this; return this;
} }
public <T> LambdaConditionBuilder or(LambdaGetter<T> fn) {
return new LambdaConditionBuilder(this, LambdaUtil.getQueryColumn(fn), SqlConnector.OR);
}
public Joiner<QueryWrapper> leftJoin(String table) { public Joiner<QueryWrapper> leftJoin(String table) {
return joining(Join.TYPE_LEFT, new QueryTable(table), true); 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 javax.sql.DataSource;
import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT;
import static com.mybatisflex.test.table.ArticleTableDef.ARTICLE;
public class EntityTestStarter { public class EntityTestStarter {
public static void main(String[] args) { public static void main(String[] args) {
@ -117,8 +114,9 @@ public class EntityTestStarter {
// , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge) // , ACCOUNT.AGE.as(ArticleDTO::getAuthorAge)
// , ACCOUNT.BIRTHDAY // , ACCOUNT.BIRTHDAY
// ) // )
.from(ARTICLE) .from(Article.class)
.leftJoin(ACCOUNT).as("a").on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID)) // .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) .where(Account::getId).ge(100, If::notEmpty)
.and(queryWrapper -> { .and(queryWrapper -> {
queryWrapper queryWrapper