您可以尝试使用javacc(Java Compiler Compiler)之类的东西来实现解析器,或者只是通过蛮力手动解析字符串。每次遇到表达式时,都将其表示为对象。然后,您只需要将表达式树转换为 where 子句。
例如:“哈利波特”变成了
new AndExp(new FieldContainsExp("NAME", "Harry"), new FieldContainsExp("NAME", "Potter")
而“publisher:Nature* pages > 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);
}
其余的你可以想象。您可以随意嵌套 And 表达式。