diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/Brackets.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/Brackets.java index e99873e3..9a2a6665 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/Brackets.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/Brackets.java @@ -16,6 +16,7 @@ package com.mybatisflex.core.query; import com.mybatisflex.core.constant.SqlConnector; +import com.mybatisflex.core.constant.SqlConsts; import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.util.ObjectUtil; import com.mybatisflex.core.util.StringUtil; @@ -114,10 +115,10 @@ public class Brackets extends QueryCondition { String childSql = childCondition.toSql(queryTables, dialect); if (StringUtil.isNotBlank(childSql)) { QueryCondition prevEffectiveCondition = getPrevEffectiveCondition(); - if (prevEffectiveCondition != null) { - childSql = prevEffectiveCondition.connector + "(" + childSql + ")"; + if (prevEffectiveCondition != null && this.connector != null) { + childSql = this.connector + SqlConsts.BRACKET_LEFT + childSql + SqlConsts.BRACKET_RIGHT; } else if (StringUtil.isNotBlank(sqlNext)) { - childSql = "(" + childSql + ")"; + childSql = SqlConsts.BRACKET_LEFT + childSql + SqlConsts.BRACKET_RIGHT; } sql.append(childSql); } else { diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java index f58dab3a..ee39690e 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/CPI.java @@ -134,7 +134,7 @@ public class CPI { queryWrapper.addJoin(join); } - public static QueryCondition getPrevCondition(QueryCondition queryCondition) { + public static QueryCondition getPrevEffectiveCondition(QueryCondition queryCondition) { return queryCondition.getPrevEffectiveCondition(); } diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorQueryCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorQueryCondition.java index 258d75ff..05e3485b 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorQueryCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorQueryCondition.java @@ -49,8 +49,8 @@ public class OperatorQueryCondition extends QueryCondition { String childSql = childCondition.toSql(queryTables, dialect); if (StringUtil.isNotBlank(childSql)) { QueryCondition prevEffectiveCondition = getPrevEffectiveCondition(); - if (prevEffectiveCondition != null) { - sql.append(prevEffectiveCondition.connector); + if (prevEffectiveCondition != null && this.connector != null) { + sql.append(this.connector); } sql.append(operator) .append(SqlConsts.BRACKET_LEFT) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java index 2de9e3ae..ac5c33c2 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/OperatorSelectCondition.java @@ -50,10 +50,9 @@ public class OperatorSelectCondition extends QueryCondition { if (checkEffective()) { String childSql = dialect.buildSelectSql(queryWrapper); if (StringUtil.isNotBlank(childSql)) { - QueryCondition prevEffectiveCondition = getPrevEffectiveCondition(); - if (prevEffectiveCondition != null) { - sql.append(prevEffectiveCondition.connector); + if (prevEffectiveCondition != null && this.connector != null) { + sql.append(this.connector); } sql.append(operator) .append(SqlConsts.BRACKET_LEFT) 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 1f4862b1..ff17cd2f 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 @@ -157,11 +157,12 @@ public class QueryCondition implements CloneSupport { } protected void connect(QueryCondition nextCondition, SqlConnector connector) { + if (this.next != null) { this.next.connect(nextCondition, connector); } else { + nextCondition.connector = connector; this.next = nextCondition; - this.connector = connector; nextCondition.prev = this; } } @@ -171,8 +172,8 @@ public class QueryCondition implements CloneSupport { //检测是否生效 if (checkEffective()) { QueryCondition prevEffectiveCondition = getPrevEffectiveCondition(); - if (prevEffectiveCondition != null) { - sql.append(prevEffectiveCondition.connector); + if (prevEffectiveCondition != null && this.connector != null) { + sql.append(this.connector); } //列 sql.append(getColumn().toConditionSql(queryTables, dialect)); @@ -208,6 +209,11 @@ public class QueryCondition implements CloneSupport { } + /** + * 获取上一个 “有效” 的条件 + * + * @return QueryCondition + */ protected QueryCondition getPrevEffectiveCondition() { if (prev == null) { return null; diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/RawFragment.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/RawFragment.java index dd137010..f13c53b6 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/RawFragment.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/query/RawFragment.java @@ -58,8 +58,8 @@ public class RawFragment extends QueryCondition { //检测是否生效 if (checkEffective()) { QueryCondition prevEffectiveCondition = getPrevEffectiveCondition(); - if (prevEffectiveCondition != null) { - sql.append(prevEffectiveCondition.connector); + if (prevEffectiveCondition != null && this.connector != null) { + sql.append(this.connector); } sql.append(SqlConsts.BLANK).append(content).append(SqlConsts.BLANK); } diff --git a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java index 0144e9d1..8821e335 100644 --- a/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java +++ b/mybatis-flex-core/src/test/java/com/mybatisflex/coretest/AccountSqlTester.java @@ -21,17 +21,16 @@ import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.KeywordWrap; import com.mybatisflex.core.dialect.LimitOffsetProcessor; import com.mybatisflex.core.dialect.impl.CommonsDialectImpl; -import com.mybatisflex.core.dialect.impl.DmDialect; -import com.mybatisflex.core.dialect.impl.OracleDialect; -import com.mybatisflex.core.query.*; -import com.mybatisflex.core.table.DynamicTableProcessor; +import com.mybatisflex.core.query.DistinctQueryColumn; +import com.mybatisflex.core.query.QueryWrapper; +import com.mybatisflex.core.query.RawQueryColumn; +import com.mybatisflex.core.query.SqlOperators; import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfoFactory; import com.mybatisflex.core.table.TableManager; +import org.junit.Assert; import org.junit.Test; -import java.util.Arrays; - import static com.mybatisflex.core.query.QueryMethods.*; import static com.mybatisflex.coretest.table.Account01TableDef.ACCOUNT01; import static com.mybatisflex.coretest.table.AccountTableDef.ACCOUNT; @@ -46,9 +45,7 @@ public class AccountSqlTester { .select() .from(ACCOUNT); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account`",query.toSQL()); } @Test @@ -57,21 +54,24 @@ public class AccountSqlTester { .select() .from(ACCOUNT01); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `flex`.`tb_a01`",query.toSQL()); } @Test public void testSelectWithSchemaSql01() { QueryWrapper query = new QueryWrapper() .select() - .from(ACCOUNT01).leftJoin(ACCOUNT).on(ACCOUNT01.ID.eq(ACCOUNT.ID)) + .from(ACCOUNT01) + .leftJoin(ACCOUNT).on(ACCOUNT01.ID.eq(ACCOUNT.ID)) .where(ACCOUNT01.ID.ge(100)) .and(ACCOUNT.SEX.eq(1)); TableManager.setDynamicTableProcessor(tableName -> tableName + "_01"); - TableManager.setDynamicTableProcessor(original -> original + "_01"); + + Assert.assertEquals("SELECT * FROM `flex`.`tb_a01_01` " + + "LEFT JOIN `tb_account_01` ON `flex`.`tb_a01_01`.`id` = `tb_account_01`.`id` " + + "WHERE `flex`.`tb_a01_01`.`id` >= 100 AND `tb_account_01`.`sex` = 1" + ,query.toSQL()); System.out.println(query.toSQL()); } @@ -86,7 +86,11 @@ public class AccountSqlTester { .and(ACCOUNT.SEX.eq(1)); TableManager.setDynamicTableProcessor(original -> original + "_01"); - TableManager.setDynamicTableProcessor(original -> original + "_01"); + + Assert.assertEquals("SELECT * FROM `flex`.`tb_a01_01` AS `a1` " + + "LEFT JOIN `tb_account_01` ON `a1`.`id` = `tb_account_01`.`id` " + + "WHERE `a1`.`id` >= 100 AND `tb_account_01`.`sex` = 1" + ,query.toSQL()); System.out.println(query.toSQL()); } @@ -98,9 +102,10 @@ public class AccountSqlTester { .select(ACCOUNT.ID, ACCOUNT.USER_NAME) .from(ACCOUNT); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT `id`, `user_name` FROM `tb_account`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test @@ -112,9 +117,13 @@ public class AccountSqlTester { .from(ACCOUNT.as("a"), ARTICLE.as("b")) .where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)); - IDialect dialect = new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.MYSQL); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT `a`.`id`, `a`.`user_name`, `b`.`id` AS `articleId`, `b`.`title`, " + + "MAX(`a`.`age`) AS `ageMax` " + + "FROM `tb_account` AS `a`, `tb_article` AS `b` " + + "WHERE `a`.`id` = `b`.`account_id`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test @@ -123,9 +132,13 @@ public class AccountSqlTester { .select(ACCOUNT.ID, ACCOUNT.USER_NAME, ACCOUNT.AGE.as("aGe"), max(ACCOUNT.BIRTHDAY).as("Max_BirthDay"), avg(ACCOUNT.SEX).as("sex_avg")) .from(ACCOUNT.as("tableAlias")); - IDialect dialect = new OracleDialect(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT `id`, `user_name`, `age` AS `aGe`, " + + "MAX(`birthday`) AS `Max_BirthDay`, " + + "AVG(`sex`) AS `sex_avg` " + + "FROM `tb_account` AS `tableAlias`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test @@ -134,24 +147,29 @@ public class AccountSqlTester { .select(ACCOUNT.ID, ACCOUNT.USER_NAME, ACCOUNT.AGE.as("aGe"), max(ACCOUNT.BIRTHDAY).as("Max_BirthDay"), avg(ACCOUNT.SEX).as("sex_avg")) .from(ACCOUNT.as("tableAlias")); - IDialect dialect = new DmDialect(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT `id`, `user_name`, `age` AS `aGe`, " + + "MAX(`birthday`) AS `Max_BirthDay`, " + + "AVG(`sex`) AS `sex_avg` " + + "FROM `tb_account` AS `tableAlias`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testDistinctColumnAlias() { - QueryWrapper queryWrapper = new QueryWrapper() + QueryWrapper query = new QueryWrapper() .select( new DistinctQueryColumn(ACCOUNT.SEX).as("sexDis")) .select( ACCOUNT.USER_NAME.add(ACCOUNT.AGE).as("addAlias")) .select(new RawQueryColumn("abc").as("aBc")) .from(ACCOUNT); -// IDialect dialect = new CommonsDialectImpl(); - IDialect dialect = new OracleDialect(); -// IDialect dialect = new DmDialect(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println("sql = " + sql); + + Assert.assertEquals("SELECT DISTINCT `sex` AS `sexDis`, (`user_name` + `age`) AS `addAlias`, abc AS `aBc` " + + "FROM `tb_account`" + ,query.toSQL()); + + System.out.println("sql = " + query.toSQL()); } @@ -162,9 +180,10 @@ public class AccountSqlTester { .select(ACCOUNT.ALL_COLUMNS) .from(ACCOUNT); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @@ -177,88 +196,115 @@ public class AccountSqlTester { .union(select(ARTICLE.ID).from(ARTICLE)) .unionAll(select(ARTICLE.ID).from(ARTICLE)); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(query); - System.out.println(sql); + Assert.assertEquals("(SELECT `id` FROM `tb_account` ORDER BY `id` DESC) " + + "UNION (SELECT `id` FROM `tb_article`) " + + "UNION ALL (SELECT `id` FROM `tb_article`)" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testWhereSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.like("michael")); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "WHERE `id` >= 100 AND `user_name` LIKE '%michael%'" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testWhere2Sql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select(column("A.*"), column("b.x")) .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(column("aaa").in("michael", "aaa")); - System.out.println(queryWrapper.toSQL()); + Assert.assertEquals("SELECT A.*, b.x FROM `tb_account` " + + "WHERE `id` >= 100 AND aaa IN ('michael', 'aaa')" + ,query.toSQL()); + + System.out.println(query.toSQL()); } + @Test + public void testWhereIssues181() { + int id = 100; + String name = null; + QueryWrapper query = QueryWrapper.create() + .from(ACCOUNT) + .where(ACCOUNT.ID.ge(100)) + .and(ACCOUNT.USER_NAME.eq(name)) + .or(ACCOUNT.SEX.eq(null).and(ACCOUNT.BIRTHDAY.eq(1))) + .or(ACCOUNT.SEX.eq(1).and(ACCOUNT.BIRTHDAY.eq(2))); + + String sql = "SELECT * FROM `tb_account` WHERE `id` >= 100 OR (`birthday` = 1) OR (`sex` = 1 AND `birthday` = 2)"; + Assert.assertEquals(sql,query.toSQL()); + System.out.println(query.toSQL()); + } + + + + @Test public void testWhereCond1Sql() { boolean flag = false; - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100).when(flag)) .and(ACCOUNT.USER_NAME.like("michael")); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` WHERE `user_name` LIKE '%michael%'" + ,query.toSQL()); - Object[] valueArray = CPI.getValueArray(queryWrapper); - System.out.println(Arrays.toString(valueArray)); + System.out.println(query.toSQL()); } @Test public void testWhereSql3() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.USER_NAME.notLike("michael")); - System.out.println(queryWrapper.toSQL()); + Assert.assertEquals("SELECT * FROM `tb_account` WHERE `id` >= 100 AND `user_name` NOT LIKE '%michael%'" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testWhereCond2Sql() { boolean flag = false; - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(flag ? ACCOUNT.ID.ge(100) : noCondition()) .and(ACCOUNT.USER_NAME.like("michael")); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` WHERE `user_name` LIKE '%michael%'" + ,query.toSQL()); - Object[] valueArray = CPI.getValueArray(queryWrapper); - System.out.println(Arrays.toString(valueArray)); + System.out.println(query.toSQL()); } @Test public void testWhereExistSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) @@ -268,50 +314,61 @@ public class AccountSqlTester { ) ); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "WHERE `id` >= 100 " + + "AND EXISTS (SELECT 1 FROM `tb_article` AS `a` WHERE `id` >= 100)" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testWhereAndOrSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge(100)) .and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))) .or(ACCOUNT.AGE.in(18, 19, 20).or(ACCOUNT.USER_NAME.like("michael"))); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "WHERE `id` >= 100 " + + "AND (`sex` = 1 OR `sex` = 2) " + + "OR (`age` IN (18, 19, 20) OR `user_name` LIKE '%michael%')" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testWhereSelectSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .where(ACCOUNT.ID.ge( select(ARTICLE.ACCOUNT_ID).from(ARTICLE).where(ARTICLE.ID.ge(100)) )); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + + Assert.assertEquals("SELECT * FROM `tb_account`" + + " WHERE `id` >= (SELECT `account_id` FROM `tb_article` WHERE `id` >= 100)" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testGroupSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` GROUP BY `user_name`" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @@ -322,38 +379,50 @@ public class AccountSqlTester { .from(ACCOUNT).as("a") .from(ACCOUNT01).as("b") .groupBy(year(ACCOUNT.BIRTHDAY)); + + Assert.assertEquals("SELECT * FROM `tb_account` AS `a`, `flex`.`tb_a01` AS `b` " + + "GROUP BY YEAR(`a`.`birthday`)" + ,query.toSQL()); + System.out.println(query.toSQL()); } @Test public void testHavingSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .groupBy(ACCOUNT.USER_NAME) .having(ACCOUNT.AGE.between(18, 25)); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "GROUP BY `user_name` " + + "HAVING `age` BETWEEN 18 AND 25 " + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testJoinSql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)) .where(ACCOUNT.AGE.ge(10)); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "LEFT JOIN `tb_article` " + + "ON `tb_account`.`id` = `tb_article`.`account_id` " + + "WHERE `tb_account`.`age` >= 10" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testJoin2Sql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .leftJoin(ARTICLE).on( @@ -361,14 +430,18 @@ public class AccountSqlTester { ) .where(ACCOUNT.AGE.ge(10)); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "LEFT JOIN `tb_article` " + + "ON `tb_account`.`id` = `tb_article`.`account_id` AND `tb_account`.`age` = 18 " + + "WHERE `tb_account`.`age` >= 10" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test public void testJoin3Sql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .leftJoin( @@ -378,9 +451,13 @@ public class AccountSqlTester { ) .where(ACCOUNT.AGE.ge(10)); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + Assert.assertEquals("SELECT * FROM `tb_account` " + + "LEFT JOIN (SELECT * FROM `tb_article` WHERE `id` >= 100) AS `a` " + + "ON `tb_account`.`id` = a.id " + + "WHERE `tb_account`.`age` >= 10" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @@ -395,6 +472,16 @@ public class AccountSqlTester { .leftJoin("base_admin_user_info").as("bui").on("bui.user_id = burm.user_id") .leftJoin("base_admin_user_info").as("burmc").on("burmc.user_id = burm.created_by") .where("bui.is_valid = ?", 3); + + Assert.assertEquals("SELECT `burm`.*, bui.user_code, bui.user_name, burmc.user_name as created_by_name " + + "FROM `tb_account` AS `burm` " + + "LEFT JOIN `base_admin_user_info` AS `bui` " + + "ON bui.user_id = burm.user_id " + + "LEFT JOIN `base_admin_user_info` AS `burmc` " + + "ON burmc.user_id = burm.created_by " + + "WHERE bui.is_valid = 3 " + ,query.toSQL()); + System.out.println(query.toSQL()); } @@ -421,14 +508,17 @@ public class AccountSqlTester { @Test public void testOrderBySql() { - QueryWrapper queryWrapper = QueryWrapper.create() + QueryWrapper query = QueryWrapper.create() .select() .from(ACCOUNT) .orderBy(ACCOUNT.AGE.asc(), ACCOUNT.USER_NAME.desc().nullsLast()); - IDialect dialect = new CommonsDialectImpl(); - String sql = dialect.forSelectByQuery(queryWrapper); - System.out.println(sql); + + Assert.assertEquals("SELECT * FROM `tb_account` " + + "ORDER BY `age` ASC, `user_name` DESC NULLS LAST" + ,query.toSQL()); + + System.out.println(query.toSQL()); } @Test @@ -436,6 +526,10 @@ public class AccountSqlTester { IDialect dialect = new CommonsDialectImpl(); TableInfo tableInfo = TableInfoFactory.ofEntityClass(Account.class); String sql = dialect.forDeleteEntityById(tableInfo); + + Assert.assertEquals("UPDATE `tb_account` SET `is_delete` = 1 WHERE `id` = ? AND `is_delete` = 0" + ,sql); + System.out.println(sql); } @@ -450,6 +544,10 @@ public class AccountSqlTester { .forUpdate(); String sql = dialect.forSelectByQuery(queryWrapper); + + Assert.assertEquals("SELECT * FROM `tb_account` WHERE `user_name` LIKE ? FOR UPDATE" + ,sql); + System.out.println(sql); } @@ -607,6 +705,15 @@ public class AccountSqlTester { account.setUserName("michael"); QueryWrapper qw = QueryWrapper.create(account); + + Assert.assertEquals("SELECT `id`, `user_name`, `birthday`, `sex`, `age`, `is_normal`, `is_delete` " + + "FROM `tb_account` " + + "WHERE `user_name` = 'michael' " + + "AND `sex` = 0 " + + "AND `age` = 18 " + + "AND `is_normal` = false" + ,qw.toSQL()); + System.out.println(qw.toSQL()); } @@ -623,6 +730,12 @@ public class AccountSqlTester { QueryWrapper qw = QueryWrapper.create(account, operators); + Assert.assertEquals("SELECT `id`, `user_name`, `birthday`, `sex`, `age`, `is_normal`, `is_delete` FROM `tb_account` " + + "WHERE `user_name` LIKE '%michael%' A" + + "ND `sex` = 0 " + + "AND `age` >= 18 " + + "AND `is_normal` = false" + ,qw.toSQL()); System.out.println(qw.toSQL()); } }