假设我们有如下的Java对象和嵌套集合:

public class Person {
    private String name;
    private int age;
    private List<Address> addresses;
    // getters and setters
}

public class Address {
    private String street;
    private String city;
    private String state;
    // getters and setters
}

Person person = new Person();
person.setName("John");
person.setAge(30);

Address address1 = new Address();
address1.setStreet("123 Main St");
address1.setCity("Anytown");
address1.setState("CA");

Address address2 = new Address();
address2.setStreet("456 Elm St");
address2.setCity("Othertown");
address2.setState("NY");

List<Address> addresses = new ArrayList<>();
addresses.add(address1);
addresses.add(address2);

person.setAddresses(addresses);

我们想要根据这个对象和集合拼接出如下的SQL条件:

(name = 'John' AND age = 30 AND (street = '123 Main St' AND city = 'Anytown' AND state = 'CA') OR (street = '456 Elm St' AND city = 'Othertown' AND state = 'NY'))

可以使用递归来实现这个功能。首先,我们需要一个方法来拼接单个对象的条件:

private String getConditionString(Object obj) {
    StringBuilder sb = new StringBuilder();
    Class<?> clazz = obj.getClass();
    Field[] fields = clazz.getDeclaredFields();
    sb.append("(");
    for (Field field : fields) {
        field.setAccessible(true);
        try {
            Object value = field.get(obj);
            if (value != null) {
                sb.append(field.getName()).append(" = '").append(value).append("' AND ");
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    sb.delete(sb.length() - 5, sb.length());
    sb.append(")");
    return sb.toString();
}

这个方法接收一个任意对象,利用反射获取对象的所有属性和对应的值,拼接成一个条件字符串。注意,这里只处理了基本类型和字符串类型的属性,如果有其他类型的属性需要根据具体情况进行修改。

接下来,我们需要一个递归方法来处理嵌套集合:

private String getNestedConditionString(List<?> list) {
    StringBuilder sb = new StringBuilder();
    sb.append("(");
    for (Object obj : list) {
        if (obj instanceof List) {
            sb.append(getNestedConditionString((List<?>) obj)).append(" OR ");
        } else {
            sb.append(getConditionString(obj)).append(" OR ");
        }
    }
    sb.delete(sb.length() - 4, sb.length());
    sb.append(")");
    return sb.toString();
}

这个方法接收一个集合,遍历集合中的每个元素,如果元素是一个集合,则递归调用这个方法;否则,调用上面的方法拼接单个对象的条件。最后将所有条件用 OR 连接起来,返回一个条件字符串。

最后,我们可以调用这两个方法来拼接整个条件:

String condition = getConditionString(person) + " AND " + getNestedConditionString(person.getAddresses());
System.out.println(condition);

输出结果为:

(name = 'John' AND age = 30 AND ((street = '123 Main St' AND city = 'Anytown' AND state = 'CA') OR (street = '456 Elm St' AND city = 'Othertown' AND state = 'NY')))
java递归对象嵌套集合拼接sql条件

原文地址: https://www.cveoy.top/t/topic/bt2U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录