From 79a1ebe54db0fc6fe132248dff20b4a1056ca06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=80=E6=BA=90=E6=B5=B7=E5=93=A5?= Date: Mon, 29 May 2023 17:12:48 +0800 Subject: [PATCH] fixed optimize left join error; close #I796OG --- .../core/query/QueryCondition.java | 17 ++++-- .../mybatisflex/test/EntityTestStarter.java | 61 +++++++++---------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java index 2149855a..b69bb0f2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/QueryCondition.java @@ -269,16 +269,23 @@ public class QueryCondition implements Serializable { } - boolean containsTable(String... tables){ - if (column == null){ - return false; + boolean containsTable(String... tables) { + if (column == null || !checkEffective()) { + return nextContainsTable(tables); } for (String table : tables) { - if (column.table != null && table.equals(column.table.name)){ + if (column.table != null && table.equals(column.table.name)) { return true; } } - return false; + return nextContainsTable(tables); + } + + private boolean nextContainsTable(String... tables) { + if (next == null) { + return false; + } + return next.containsTable(tables); } @Override diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java index adae7e68..aa6cc98a 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/EntityTestStarter.java @@ -21,16 +21,12 @@ import com.mybatisflex.core.audit.ConsoleMessageCollector; import com.mybatisflex.core.audit.MessageCollector; import com.mybatisflex.core.paginate.Page; import com.mybatisflex.core.query.QueryWrapper; -import com.mybatisflex.core.row.Db; -import com.mybatisflex.core.row.Row; -import com.mybatisflex.core.row.RowUtil; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import javax.sql.DataSource; import java.util.List; -import static com.mybatisflex.core.query.QueryMethods.case_; import static com.mybatisflex.core.query.QueryMethods.select; import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT; import static com.mybatisflex.test.table.ArticleTableDef.ARTICLE; @@ -60,33 +56,33 @@ public class EntityTestStarter { AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class); - QueryWrapper wrapper = QueryWrapper.create().select(ACCOUNT.ID - , case_().when(ACCOUNT.ID.ge(2)).then("x2") - .when(ACCOUNT.ID.ge(1)).then("x1") - .else_("x100") - .end().as("xName") - ).from(ACCOUNT); - - List rowList = Db.selectListByQuery(wrapper); - RowUtil.printPretty(rowList); - - - accountMapper.updateNumberAddByQuery("age", 100, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); - accountMapper.updateNumberAddByQuery(Account::getAge, -50, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); - - - Db.updateNumberAddByQuery("tb_account", "age", 30, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); - Db.updateNumberAddByQuery("tb_account", "age", -20, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); - - - List accounts1 = accountMapper.selectListByQuery(QueryWrapper.create() - , accountFieldQueryBuilder -> accountFieldQueryBuilder - .field(Account::getArticles) - .queryWrapper(entity -> - select().from(ARTICLE).where(ARTICLE.ACCOUNT_ID.eq(entity.getId())) - ) - ); - System.out.println(accounts1); +// QueryWrapper wrapper = QueryWrapper.create().select(ACCOUNT.ID +// , case_().when(ACCOUNT.ID.ge(2)).then("x2") +// .when(ACCOUNT.ID.ge(1)).then("x1") +// .else_("x100") +// .end().as("xName") +// ).from(ACCOUNT); +// +// List rowList = Db.selectListByQuery(wrapper); +// RowUtil.printPretty(rowList); +// +// +// accountMapper.updateNumberAddByQuery("age", 100, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); +// accountMapper.updateNumberAddByQuery(Account::getAge, -50, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); +// +// +// Db.updateNumberAddByQuery("tb_account", "age", 30, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); +// Db.updateNumberAddByQuery("tb_account", "age", -20, QueryWrapper.create().where(ACCOUNT.ID.eq(1))); +// +// +// List accounts1 = accountMapper.selectListByQuery(QueryWrapper.create() +// , accountFieldQueryBuilder -> accountFieldQueryBuilder +// .field(Account::getArticles) +// .queryWrapper(entity -> +// select().from(ARTICLE).where(ARTICLE.ACCOUNT_ID.eq(entity.getId())) +// ) +// ); +// System.out.println(accounts1); // MyAccountMapper myAccountMapper = bootstrap.getMapper(MyAccountMapper.class); @@ -124,7 +120,8 @@ public class EntityTestStarter { ) .from(ARTICLE) .leftJoin(ACCOUNT).on(ARTICLE.ACCOUNT_ID.eq(ACCOUNT.ID)) - .where(ACCOUNT.ID.ge(0)); +// .where(ACCOUNT.ID.ge(0)); + .where(ARTICLE.ID.ge(0).or(ACCOUNT.ID.ge(0))); // // List articleDTOS = accountMapper.selectListByQueryAs(asWrapper, ArticleDTO.class); // System.out.println(articleDTOS);