Вы можете попробовать использовать что-то вроде javacc (компилятор Java) для реализации синтаксического анализатора или просто вручную проанализировать строку методом грубой силы Каждый раз, когда вы сталкиваетесь с выражением, вы представляете его как объект. Тогда вам просто нужно перевести ваше дерево выражений в предложение where.
Например: «Гарри Поттер» становится
new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter")
А "издатель: Природа * страниц> 100" становится
new AndExp(new FieldContainsExp("PUBLISHER", "Nature"), FieldGreaterThan("PAGES", 100))
Затем, когда они у вас есть, их довольно легко превратить в SQL:
FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) {
sql.append(fieldName);
sql.append(" like ");
sql.append("'%?%'");
args.add(value);
}
AndExp.toSQL(StringBuffer sql, Collection<Object> args) {
exp1.toSQL(sql, args);
sql.append(" AND ");
exp2.toSQL(sql, args);
}
Вы можете представить себе остальное. Вы можете вкладывать и выражения так глубоко, как вы хотите.