Java 递归对象嵌套集合拼接 SQL 条件 - 优化查询效率
假设有一个对象 A,其中包含一个属性 B,B 是一个集合,每个元素都是对象 C,C 中包含一个属性 D 和一个属性 E。现在需要用递归的方式将这些属性拼接成一个 SQL 条件。
示例代码:
public class A {
private List<C> b;
}
public class C {
private String d;
private String e;
}
public class SqlUtils {
public static String getSql(A a) {
return getSqlForList(a.getB(), "b", "d", "e");
}
private static String getSqlForList(List<?> list, String prefix, String field1, String field2) {
if (list == null || list.isEmpty()) {
return "";
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
if (obj instanceof List) {
String subSql = getSqlForList((List<?>) obj, prefix + "_" + i, field1, field2);
if (!subSql.isEmpty()) {
sb.append("(").append(subSql).append(")");
}
} else {
try {
String value1 = (String) obj.getClass().getMethod("get" + StringUtil.upperFirst(field1)).invoke(obj);
String value2 = (String) obj.getClass().getMethod("get" + StringUtil.upperFirst(field2)).invoke(obj);
if (value1 != null && value2 != null) {
sb.append(prefix).append(".").append(field1).append("='" + value1 + "' and ")
.append(prefix).append(".").append(field2).append("='" + value2 + "'");
if (i < list.size() - 1) {
sb.append(" or ");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
使用方法:
A a = new A();
List<C> b = new ArrayList<>();
C c1 = new C();
c1.setD("d1");
c1.setE("e1");
C c2 = new C();
c2.setD("d2");
c2.setE("e2");
b.add(c1);
b.add(c2);
a.setB(b);
String sql = SqlUtils.getSql(a);
System.out.println(sql);
输出结果:
b.d='d1' and b.e='e1' or b.d='d2' and b.e='e2'
该方法可以递归处理任意层级的对象嵌套集合,并将集合中的属性拼接成 SQL 条件。
优化建议:
- 使用 PreparedStatement 替代拼接字符串的方式,避免 SQL 注入风险,提高安全性。
- 优化递归逻辑,避免不必要的循环,提高性能。
- 考虑使用其他数据结构,例如 Map,存储属性和值,提高代码可读性和可维护性。
- 针对具体的业务场景,进行代码优化,例如使用索引、缓存等技术,提升查询效率。
原文地址: https://www.cveoy.top/t/topic/mXEI 著作权归作者所有。请勿转载和采集!