我打算为我的 View /业务层提供将字符串形式的 HQL 查询发送到我的数据层的可能性。
但是,数据层需要分析和操作这些查询(特别是,在 where 子句中添加条件)。
支持的 HQL 查询形式是以下任意组合:
from ...
where ...
order by ...
我认为这种简化的 HQL 查询应该是正则表达式,这是我定义的正则表达式:
public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+)\s*)?"
+ @"(\bwhere\b\s*(?<WherePart>.+)\s*)?"
+ @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+))?$";
Regex re = new Regex(Novartis.MapAdmeBs.NHibernateDAO.DAOFactory.HqlRegex,
RegexOptions.Singleline);
更新:我什至尝试过使用非贪婪修饰符:
public const string HqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+?)\s*)?"
+ @"(\bwhere\b\s*(?<WherePart>.+?)\s*)?"
+ @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+?))?$";
但是,当我尝试匹配包含 where 和 order by 子句的字符串时,“order by”关键字被视为 where 子句的一部分:
Match m = re.Match("where (e.Name not like '%X') and e.StatusID not in (7, 8, 9)"
+ " order by e.DateCreated desc");
Console.WriteLine(m.Groups["WherePart"].Value);
给予
(e.Name not like '%X') and e.StatusID not in (7, 8, 9) order by e.DateCreated desc
感谢以下任何帮助:
- 如何修复正则表达式?
- 有 HQL 的正则表达式吗? (谷歌搜索导致 HQL 语言的正则表达式特征)
- 更好的想法是哪个仍然足够简单,可以在一天或更短的时间内实现?
请您参考如下方法:
HQL 没有正则表达式,因为 HQL 不是常规语言。
要进行快速修复,您可以使用 non-greedy modifier ? 对于每个 .+:
string hqlRegex = @"^(\bfrom\b\s*(?<FromPart>.+?)\s*)?"
+ @"(\bwhere\b\s*(?<WherePart>.+?)\s*)?"
+ @"(\border\b\s+\bby\b\s*(?<OrderByPart>.+?))?$";
Regex re = new Regex(hqlRegex);
Match m = re.Match("where (e.Name not like '%X') and e.StatusID not in (7, 8, 9)"
+ " order by e.DateCreated desc");
string wherePart = m.Groups["WherePart"].Value;
Console.WriteLine(wherePart);
结果:
(e.Name not like '%X') and e.StatusID not in (7, 8, 9)
我还想指出,在例如 order\b\s+\bby 中包含 a 字边界是没有意义的。 r 和空白字符之间必须始终有一个单词边界,因此无需指定。
如果您希望使用 ANTLR 执行此操作,那么您可以查看文章 Working with ANTLR: HQL Grammar .
