Skip to content

Commit 0daed26

Browse files
author
veasion
committed
支持查询结果中带子查询
1 parent 3d03612 commit 0daed26

File tree

9 files changed

+77
-9
lines changed

9 files changed

+77
-9
lines changed

src/main/java/cn/veasion/db/AbstractFilter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public T filterSubQuery(String field, Operator operator, SubQueryParam subQueryP
107107
}
108108

109109
public T filterExpression(String field, Operator operator, String expression, Object... values) {
110-
return filterExpression(field, Operator.EQ, Expression.filter(expression, values));
110+
return filterExpression(field, operator, Expression.filter(expression, values));
111111
}
112112

113113
public T filterExpression(String field, Operator operator, Expression expression) {

src/main/java/cn/veasion/db/interceptor/LogicDeleteInterceptor.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ private void handleQuery(AbstractQuery<?> query) {
108108
if (query instanceof SubQuery) {
109109
handleQuery(((SubQuery) query).getSubQuery());
110110
}
111+
handleSelectSubQuery(query.getSelectSubQueryList());
111112
handleFilter(query);
112113
if (query instanceof AbstractJoinQuery) {
113114
List<JoinQueryParam> joinList = ((AbstractJoinQuery<?>) query).getJoinAll();
@@ -118,9 +119,10 @@ private void handleQuery(AbstractQuery<?> query) {
118119
handleQuery(((SubQuery) joinQuery).getSubQuery());
119120
} else {
120121
if (!containSkipClass(joinQuery)) {
122+
handleSelectSubQuery(joinQuery.getSelectSubQueryList());
121123
handleOnFilter(joinQueryParam::getOnFilters, joinQueryParam::on, joinQuery.getTableAs());
122124
}
123-
handleSubQuery(joinQuery.getFilters());
125+
handleFilterSubQuery(joinQuery.getFilters());
124126
}
125127
}
126128
}
@@ -141,7 +143,7 @@ private void handleUpdate(AbstractUpdate<?> update) {
141143
if (!containSkipClass(joinUpdate)) {
142144
handleOnFilter(joinUpdateParam::getOnFilters, joinUpdateParam::on, joinUpdate.getTableAs());
143145
}
144-
handleSubQuery(joinUpdate.getFilters());
146+
handleFilterSubQuery(joinUpdate.getFilters());
145147
}
146148
}
147149
}
@@ -184,11 +186,18 @@ private void handleFilter(AbstractFilter<?> abstractFilter) {
184186
if (!abstractFilter.hasFilter(logicDeleteField)) {
185187
abstractFilter.eq(logicDeleteField, availableValue);
186188
}
187-
handleSubQuery(abstractFilter.getFilters());
189+
handleFilterSubQuery(abstractFilter.getFilters());
188190
}
189191
}
190192

191-
private void handleSubQuery(List<Filter> filters) {
193+
private void handleSelectSubQuery(List<SubQueryParam> list) {
194+
if (list == null || list.isEmpty()) return;
195+
for (SubQueryParam sub : list) {
196+
handleQuery(sub.getQuery());
197+
}
198+
}
199+
200+
private void handleFilterSubQuery(List<Filter> filters) {
192201
if (filters == null || filters.isEmpty()) return;
193202
for (Filter filter : filters) {
194203
if (filter.isSpecial() && filter.getValue() instanceof SubQueryParam) {

src/main/java/cn/veasion/db/jdbc/AbstractSQL.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ protected String replaceSqlEval(String eval, Map<String, Class<?>> entityClassMa
145145
clazz = entityClassMap.values().iterator().next();
146146
}
147147
if (clazz == null) {
148-
return field;
148+
if (field.endsWith("`") && field.endsWith("`")) {
149+
return field;
150+
} else {
151+
return FieldUtils.humpToLine(field);
152+
}
149153
}
150154
return FieldUtils.entityFieldColumns(clazz).getOrDefault(field, field);
151155
});

src/main/java/cn/veasion/db/jdbc/QuerySQL.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import cn.veasion.db.query.JoinQueryParam;
88
import cn.veasion.db.query.OrderParam;
99
import cn.veasion.db.query.SubQuery;
10+
import cn.veasion.db.query.SubQueryParam;
1011
import cn.veasion.db.query.UnionQueryParam;
1112
import cn.veasion.db.utils.FilterUtils;
1213

1314
import java.util.Arrays;
1415
import java.util.HashMap;
16+
import java.util.LinkedHashMap;
1517
import java.util.List;
1618
import java.util.Map;
1719

@@ -68,6 +70,8 @@ private void buildQuery() {
6870
appendSelects(entityClassMap, false);
6971
// expression & join expression
7072
appendSelects(entityClassMap, true);
73+
// subQuery & join subQuery
74+
appendSelects(query.getSelectSubQueryList(), true);
7175
trimEndSql(",");
7276
// from table
7377
sql.append(" FROM ");
@@ -165,6 +169,28 @@ private void appendSelects(Map<String, Class<?>> entityClassMap, boolean isExpre
165169
}
166170
}
167171

172+
private void appendSelects(List<SubQueryParam> list, boolean main) {
173+
if (list != null && !list.isEmpty()) {
174+
for (SubQueryParam sub : list) {
175+
QuerySQL querySQL = build(sub.getQuery(), new LinkedHashMap<>());
176+
sql.append(" (").append(querySQL.getSQL()).append(")");
177+
if (!querySQL.selectFieldColumnMap.isEmpty()) {
178+
sql.append(" AS ").append(querySQL.selectFieldColumnMap.keySet().iterator().next());
179+
}
180+
sql.append(",");
181+
values.addAll(querySQL.values);
182+
}
183+
}
184+
if (main && joins != null && !joins.isEmpty()) {
185+
for (JoinQueryParam join : joins) {
186+
List<SubQueryParam> selectSubQueryList = join.getJoinQuery().getSelectSubQueryList();
187+
if (selectSubQueryList != null) {
188+
appendSelects(selectSubQueryList, false);
189+
}
190+
}
191+
}
192+
}
193+
168194
private void appendSelects(Map<String, Class<?>> entityClassMap, List<Expression> selectExpression) {
169195
if (selectExpression == null || selectExpression.isEmpty()) return;
170196
StringBuilder sb = new StringBuilder();

src/main/java/cn/veasion/db/query/AbstractQuery.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public abstract class AbstractQuery<T> extends AbstractFilter<T> {
3030
protected Map<String, String> aliasMap = new HashMap<>();
3131
private Set<String> excludeSelects;
3232
private List<Expression> selectExpression;
33+
private List<SubQueryParam> selectSubQueryList;
3334
private List<String> groupBys;
3435
private List<OrderParam> orders;
3536
private List<Filter> having;
@@ -66,6 +67,13 @@ public T selects(String... fields) {
6667
return getSelf();
6768
}
6869

70+
public T selectSubQuery(SubQueryParam subQueryParam) {
71+
Objects.requireNonNull(subQueryParam, "子查询参数不能为空");
72+
if (selectSubQueryList == null) selectSubQueryList = new ArrayList<>();
73+
selectSubQueryList.add(subQueryParam);
74+
return getSelf();
75+
}
76+
6977
public T selectExpression(String expression, String alias) {
7078
return selectExpression(Expression.select(expression, alias));
7179
}
@@ -176,6 +184,10 @@ public List<Expression> getSelectExpression() {
176184
return selectExpression;
177185
}
178186

187+
public List<SubQueryParam> getSelectSubQueryList() {
188+
return selectSubQueryList;
189+
}
190+
179191
public List<String> getGroupBys() {
180192
return groupBys;
181193
}
@@ -221,6 +233,11 @@ public void check(Class<?> mainEntityClass) {
221233
}
222234
}
223235
super.check(mainEntityClass);
236+
if (selectSubQueryList != null) {
237+
for (SubQueryParam sub : selectSubQueryList) {
238+
sub.getQuery().check(mainEntityClass);
239+
}
240+
}
224241
checkFilter(mainEntityClass, having, false);
225242
if (unions != null) {
226243
for (UnionQueryParam union : unions) {

src/main/java/cn/veasion/db/query/EntityQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public EntityQuery(Class<?> entityClass, String alias) {
1919

2020
@Override
2121
protected boolean isEmptySelects() {
22-
return getSelects().isEmpty() && getSelectExpression() == null && !isSelectAll();
22+
return getSelects().isEmpty() && getSelectExpression() == null && getSelectSubQueryList() == null && !isSelectAll();
2323
}
2424

2525
@Override

src/main/java/cn/veasion/db/query/Query.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ protected Filter handleFilter(Filter filter) {
2929

3030
@Override
3131
public void check(Class<?> mainEntityClass) {
32-
boolean emptySelect = getSelects().isEmpty() && getSelectExpression() == null && !isSelectAll();
32+
boolean emptySelect = getSelects().isEmpty() && getSelectExpression() == null && getSelectSubQueryList() == null && !isSelectAll();
3333
if (emptySelect) {
3434
super.selectAll();
3535
}

src/main/java/cn/veasion/db/query/SubQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void check(Class<?> mainEntityClass) {
4949
subQuery.check(mainEntityClass);
5050
selectAll = false;
5151
super.check(mainEntityClass);
52-
if (_selectAll || (getSelects().isEmpty() && getSelectExpression() == null)) {
52+
if (_selectAll || (getSelects().isEmpty() && getSelectExpression() == null && getSelectSubQueryList() == null)) {
5353
selects.add(0, handleField("*"));
5454
}
5555
}

src/test/java/cn/veasion/db/query/SubQueryTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cn.veasion.db.model.po.ClassesPO;
88
import cn.veasion.db.model.po.CoursePO;
99
import cn.veasion.db.model.po.StudentPO;
10+
import cn.veasion.db.model.vo.StudentVO;
1011

1112
/**
1213
* SubQueryTest
@@ -44,6 +45,17 @@ public static void main(String[] args) {
4445
.filterSubQuery("tno", Operator.IN, SubQueryParam.build(subQuery2))
4546
));
4647

48+
// 通过子查询来查询学生班级名称
49+
// select s.*, (select class_name from t_classes where id = s.class_id) as className from t_student
50+
println(studentDao.queryList(new EQ(StudentPO.class, "s")
51+
.selectAll()
52+
.selectSubQuery(SubQueryParam.build(
53+
new EQ(ClassesPO.class)
54+
.select("className")
55+
.filterExpression("id", Operator.EQ, "${s.classId}")
56+
)), StudentVO.class
57+
));
58+
4759
/*
4860
// 模拟 oracle 分页
4961
// 等价于 studentDao.queryList(new Q().page(new OraclePage(1, 10)))

0 commit comments

Comments
 (0)