Skip to content

Commit 3bc4201

Browse files
committed
fix: 修复union 指定别名错误问题
1 parent 18dd4c6 commit 3bc4201

File tree

2 files changed

+37
-19
lines changed

2 files changed

+37
-19
lines changed

hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/query/QueryAnalyzerImpl.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,33 @@ public void visit(SubSelect subSelect, String alias) {
287287
QueryAnalyzerImpl sub = new QueryAnalyzerImpl(database, body, this);
288288
Map<String, Column> columnMap = new LinkedHashMap<>();
289289
for (Column column : sub.select.getColumnList()) {
290+
// 判断子查询的列是否有显式的 SQL 别名(如 select name as n)
291+
// vs 隐式的 ORM 别名(如 select * 展开时,别名来自元数据)
292+
boolean hasExplicitSqlAlias = column.metadata != null
293+
&& !Objects.equals(column.alias, column.metadata.getAlias());
294+
295+
String exposedName;
296+
RDBColumnMetadata colMetadata = column.metadata;
297+
298+
if (hasExplicitSqlAlias) {
299+
// 显式 SQL 别名:子查询暴露的列名是 SQL 别名(如 "n")
300+
// 克隆 metadata,设置 name 为别名,清除 realName
301+
// 使得 getRealName() 返回别名,realNameDetected() 返回 false(需要大小写规范化)
302+
exposedName = column.alias;
303+
colMetadata = column.metadata.clone();
304+
colMetadata.setName(column.alias);
305+
colMetadata.setAlias(column.alias);
306+
colMetadata.setRealName(null);
307+
} else if (column.metadata == null) {
308+
// 表达式列或无元数据:使用别名作为暴露名
309+
exposedName = column.alias;
310+
} else {
311+
// 隐式 ORM 别名(如 select *):子查询暴露的列名是原始列名
312+
exposedName = column.name;
313+
}
290314

291315
columnMap.put(column.getAlias(),
292-
new Column(column.name, column.getAlias(), column.owner, column.metadata));
316+
new Column(exposedName, column.getAlias(), column.owner, colMetadata));
293317
}
294318

295319
select = new QueryAnalyzer.Select(
@@ -391,7 +415,7 @@ private void putSelectColumns(QueryAnalyzer.Table table, List<QueryAnalyzer.Colu
391415
for (QueryAnalyzer.Column column : selectTable.columns.values()) {
392416
String alias = table == select.table ? column.getAlias() : table.alias + "." + column.getAlias();
393417
container.add(new QueryAnalyzer.Column(
394-
column.name,
418+
column.getName(),
395419
alias,
396420
table.alias,
397421
column.metadata
@@ -669,6 +693,7 @@ public SqlFragments createTermFragments(QueryAnalyzerImpl impl, Term term) {
669693
}
670694

671695
String colName = col.metadata != null ? col.metadata.getRealName() : col.name;
696+
672697
String fullName = col.metadata != null
673698
? col.getMetadata().getFullName(table.alias)
674699
: table.alias + "." + dialect.quote(colName, false);
@@ -713,8 +738,6 @@ private void initColumns(StringBuilder columns) {
713738
columns.append(select.columnList.get(0).owner).append('.').append('*');
714739
return;
715740
}
716-
// 判断主表是否是 SelectTable(子查询)
717-
boolean isSelectTable = select.table instanceof QueryAnalyzer.SelectTable;
718741

719742
for (Column column : select.columnList) {
720743
if ("*".equals(column.name)) {
@@ -730,16 +753,9 @@ private void initColumns(StringBuilder columns) {
730753
continue;
731754
}
732755

733-
// 对于 SelectTable(子查询),应该使用列的别名来引用列,而不是原始列名
734-
// 因为子查询的列是通过别名暴露给外层查询的
735-
String columnName = isSelectTable && column.owner != null
736-
&& column.owner.equals(select.table.alias)
737-
? column.alias // 使用别名
738-
: column.name; // 使用原始列名
739-
740756
columns.append(column.owner)
741757
.append('.')
742-
.append(dialect.quote(columnName, column.metadata != null && !column.metadata.realNameDetected()))
758+
.append(dialect.quote(column.name, column.metadata != null && !column.metadata.realNameDetected()))
743759
.append(" as ")
744760
.append(dialect.quote(column.alias, false));
745761
}

hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/query/QueryAnalyzerImplTest.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,18 @@ public void testUnionColumns() {
9696
""");
9797

9898

99-
SqlRequest request = analyzer.refactor(QueryParamEntity.of());
99+
SqlRequest request = analyzer
100+
.refactor(QueryParamEntity.of()
101+
.and("n", "is", "123"));
100102

101103
System.out.println(request);
102104
database.sql()
103-
.reactive()
104-
.select(request.getSql(),request.getParameters())
105-
.then()
106-
.as(StepVerifier::create)
107-
.expectComplete()
108-
.verify();
105+
.reactive()
106+
.select(request.getSql(), request.getParameters())
107+
.then()
108+
.as(StepVerifier::create)
109+
.expectComplete()
110+
.verify();
109111

110112
}
111113

0 commit comments

Comments
 (0)