feat: add for update; close #I702QL

This commit is contained in:
开源海哥 2023-05-25 10:31:56 +08:00
parent f64ff59aab
commit 98975d2507
5 changed files with 96 additions and 28 deletions

View File

@ -297,6 +297,13 @@ public class CommonsDialectImpl implements IDialect {
sqlBuilder = buildLimitOffsetSql(sqlBuilder, queryWrapper, limitRows, limitOffset);
}
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sqlBuilder.append(" ").append(endFragment);
}
}
return sqlBuilder.toString();
}
@ -339,6 +346,13 @@ public class CommonsDialectImpl implements IDialect {
//buildOrderBySql(sqlBuilder, queryWrapper);
//buildLimitSql(sqlBuilder, queryWrapper);
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sqlBuilder.append(" ").append(endFragment);
}
}
return sqlBuilder.toString();
}
@ -642,6 +656,14 @@ public class CommonsDialectImpl implements IDialect {
}
sql.append(" WHERE ").append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) {
for (String endFragment : endFragments) {
sql.append(" ").append(endFragment);
}
}
return sql.toString();
}

View File

@ -38,6 +38,8 @@ public class BaseQueryWrapper<T> implements Serializable {
protected Integer limitOffset;
protected Integer limitRows;
protected List<String> endFragments;
protected Map<String, Object> context;
// protected boolean ignoreBlankStrings = false;
@ -120,6 +122,13 @@ public class BaseQueryWrapper<T> implements Serializable {
joinTables.add(queryTable);
}
protected void addEndFragment(String fragment){
if (endFragments == null){
endFragments = new ArrayList<>();
}
endFragments.add(fragment);
}
protected List<QueryTable> getQueryTables() {
return queryTables;
@ -221,6 +230,14 @@ public class BaseQueryWrapper<T> implements Serializable {
this.limitRows = limitRows;
}
protected List<String> getEndFragments() {
return endFragments;
}
protected void setEndFragments(List<String> endFragments) {
this.endFragments = endFragments;
}
protected Map<String, Object> getContext() {
return context;
}

View File

@ -158,6 +158,15 @@ public class CPI {
queryWrapper.setLimitRows(limitRows);
}
public static List<String> getEndFragments(QueryWrapper queryWrapper) {
return queryWrapper.getEndFragments();
}
public static void setEndFragments(QueryWrapper queryWrapper,List<String> endFragments) {
queryWrapper.setEndFragments(endFragments);
}
public static Map<String, Object> getContext(QueryWrapper queryWrapper) {
return queryWrapper.getContext();
}

View File

@ -155,8 +155,8 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
}
public Joiner<QueryWrapper> leftJoinIf(String table, boolean condition) {
return joining(Join.TYPE_LEFT, table, condition);
public Joiner<QueryWrapper> leftJoinIf(String table, boolean when) {
return joining(Join.TYPE_LEFT, table, when);
}
public Joiner<QueryWrapper> leftJoin(TableDef table) {
@ -164,104 +164,104 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
}
public Joiner<QueryWrapper> leftJoinIf(TableDef table, boolean condition) {
return joining(Join.TYPE_LEFT, table.getTableName(), condition);
public Joiner<QueryWrapper> leftJoinIf(TableDef table, boolean when) {
return joining(Join.TYPE_LEFT, table.getTableName(), when);
}
public Joiner<QueryWrapper> leftJoin(QueryWrapper table) {
return joining(Join.TYPE_LEFT, table, true);
}
public Joiner<QueryWrapper> leftJoinIf(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_LEFT, table, condition);
public Joiner<QueryWrapper> leftJoinIf(QueryWrapper table, boolean when) {
return joining(Join.TYPE_LEFT, table, when);
}
public Joiner<QueryWrapper> rightJoin(String table) {
return joining(Join.TYPE_RIGHT, table, true);
}
public Joiner<QueryWrapper> rightJoinIf(String table, boolean condition) {
return joining(Join.TYPE_RIGHT, table, condition);
public Joiner<QueryWrapper> rightJoinIf(String table, boolean when) {
return joining(Join.TYPE_RIGHT, table, when);
}
public Joiner<QueryWrapper> rightJoin(QueryWrapper table) {
return joining(Join.TYPE_RIGHT, table, true);
}
public Joiner<QueryWrapper> rightJoinIf(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_RIGHT, table, condition);
public Joiner<QueryWrapper> rightJoinIf(QueryWrapper table, boolean when) {
return joining(Join.TYPE_RIGHT, table, when);
}
public Joiner<QueryWrapper> innerJoin(String table) {
return joining(Join.TYPE_INNER, table, true);
}
public Joiner<QueryWrapper> innerJoinIf(String table, boolean condition) {
return joining(Join.TYPE_INNER, table, condition);
public Joiner<QueryWrapper> innerJoinIf(String table, boolean when) {
return joining(Join.TYPE_INNER, table, when);
}
public Joiner<QueryWrapper> innerJoin(TableDef table) {
return innerJoinIf(table, true);
}
public Joiner<QueryWrapper> innerJoinIf(TableDef table, boolean condition) {
return joining(Join.TYPE_INNER, table.getTableName(), condition);
public Joiner<QueryWrapper> innerJoinIf(TableDef table, boolean when) {
return joining(Join.TYPE_INNER, table.getTableName(), when);
}
public Joiner<QueryWrapper> innerJoin(QueryWrapper table) {
return joining(Join.TYPE_INNER, table, true);
}
public Joiner<QueryWrapper> innerJoinIf(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_INNER, table, condition);
public Joiner<QueryWrapper> innerJoinIf(QueryWrapper table, boolean when) {
return joining(Join.TYPE_INNER, table, when);
}
public Joiner<QueryWrapper> fullJoin(String table) {
return joining(Join.TYPE_FULL, table, true);
}
public Joiner<QueryWrapper> fullJoinIf(String table, boolean condition) {
return joining(Join.TYPE_FULL, table, condition);
public Joiner<QueryWrapper> fullJoinIf(String table, boolean when) {
return joining(Join.TYPE_FULL, table, when);
}
public Joiner<QueryWrapper> fullJoin(QueryWrapper table) {
return joining(Join.TYPE_FULL, table, true);
}
public Joiner<QueryWrapper> fullJoinIf(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_FULL, table, condition);
public Joiner<QueryWrapper> fullJoinIf(QueryWrapper table, boolean when) {
return joining(Join.TYPE_FULL, table, when);
}
public Joiner<QueryWrapper> crossJoin(String table) {
return joining(Join.TYPE_CROSS, table, true);
}
public Joiner<QueryWrapper> crossJoinIf(String table, boolean condition) {
return joining(Join.TYPE_CROSS, table, condition);
public Joiner<QueryWrapper> crossJoinIf(String table, boolean when) {
return joining(Join.TYPE_CROSS, table, when);
}
public Joiner<QueryWrapper> crossJoin(QueryWrapper table) {
return joining(Join.TYPE_CROSS, table, true);
}
public Joiner<QueryWrapper> crossJoinIf(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_CROSS, table, condition);
public Joiner<QueryWrapper> crossJoinIf(QueryWrapper table, boolean when) {
return joining(Join.TYPE_CROSS, table, when);
}
public Joiner<QueryWrapper> join(String table) {
return joining(Join.TYPE_JOIN, table, true);
}
public Joiner<QueryWrapper> join(String table, boolean condition) {
return joining(Join.TYPE_JOIN, table, condition);
public Joiner<QueryWrapper> join(String table, boolean when) {
return joining(Join.TYPE_JOIN, table, when);
}
public Joiner<QueryWrapper> join(QueryWrapper table) {
return joining(Join.TYPE_JOIN, table, true);
}
public Joiner<QueryWrapper> join(QueryWrapper table, boolean condition) {
return joining(Join.TYPE_JOIN, table, condition);
public Joiner<QueryWrapper> join(QueryWrapper table, boolean when) {
return joining(Join.TYPE_JOIN, table, when);
}
public QueryWrapper union(QueryWrapper unionQuery) {
@ -280,6 +280,12 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
return this;
}
public QueryWrapper forUpdate(){
addEndFragment("FOR UPDATE");
return this;
}
protected Joiner<QueryWrapper> joining(String type, String table, boolean condition) {
Join join = new Join(type, table, condition);
addJoinTable(join.getQueryTable());

View File

@ -292,6 +292,20 @@ public class AccountSqlTester {
System.out.println(sql);
}
@Test
public void testForUpdate() {
IDialect dialect = new CommonsDialectImpl();
QueryWrapper queryWrapper = QueryWrapper.create()
.select()
.from(ACCOUNT)
.and(ACCOUNT.USER_NAME.like("michael"))
.forUpdate();
String sql = dialect.forSelectByQuery(queryWrapper);
System.out.println(sql);
}
@Test
public void testLimitOffset() {