正则表达式的功能是非常强大的,但是要使用好也是不容易的,为了能够解析Entity Bean的Finder中的SQL,我写了可以解析部分SQL的表达式:
一个是可以支持FROM子句中的IN语法的:
SELECT\s+(DISTINCT)?\s*OBJECT\s*\(\s*(\w+)\s*\)\s+FROM\s+(\w+)(?:\s+AS)?\s+\2\s*,\s*IN\s*\(\s*\2\.(\w+)\s*\)\s*(?:\s+AS)?\s*(\w+)\s+
(?:WHERE\s+((?:(AND|OR)?\s*(\2|\5)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*)*))?
(?:\s*ORDER\s+BY\s+(\2|\5)((?:\.\w+)+)(?:\s*(asc|desc)?))?\s*
可以解析的SQL例子:
SELECT DISTINCT OBJECT(al) FROM AppLibraryConfig al, IN(al.apps) a WHERE a.id=?1 AND al.test=true AND al.flag=true and al.deleteTime is not null ORDER BY al.id desc
一个是只支持简单类型的:
SELECT\s+(DISTINCT)?\s*OBJECT\s*\(\s*(\w+)\s*\)\s+FROM\s+(\w+)(?:\s+AS)?\s+\2\s*
(?:WHERE\s+((?:(AND|OR)?\s*(\2)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*)*))?
(?:\s*ORDER\s+BY\s+(\2)((?:\.\w+)+)(?:\s*(asc|desc)?))?\s*
可以解析的SQL例子:
SELECT OBJECT(crc) from CrystalReportConfig as crc where crc.name=?1 and crc.test=true and crc.deleteTime is not null order by crc.reportName

要解析出表达式中的内容还需要另外一条表达式来辅助解析WHERE部分的不定个数的条件:
(AND|OR)?\s*\s*(\w+)((?:\.\w+)+)\s*(=|is|<>|>=|>|<|<=)\s*(NOT)?\s*(\??\d+|null|true|false|empty)\s*

(Visited 220 times, 1 visits today)