是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?
Posted
技术标签:
【中文标题】是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?【英文标题】:Is there a Java library for defining predicates as SQL-like strings? 【发布时间】:2012-11-05 18:19:50 【问题描述】:Lambdaj(和其他一些类似的库)提供了一个having
函数,它允许我像这样定义谓词(直接来自lambdaj Features 页面的示例):
List<Person> oldFriends =
filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);
我非常希望能够使用简单的字符串语法 "age > 30"
定义我的 Java 谓词对象 - 类似于 SQL where 子句 - 所以上面的过滤器变成这样:
List<Person> oldFriends =
filter(having(Person.class, "age > 30"), meAndMyFriends);
这样的库是否存在,或者任何人都可以为查询解析部分推荐一些构建块,我可以用来自己构建一个?我实际上并不介意它创建什么样的谓词(hamcrest、guava 等)。
在我的脑海中,我能想到它支持的许多事情:等式和不等式,自定义和原始类型,和/或/不,括号,LIKE
(用于字符串),in(...)
,枚举名称的解释,属性的属性。
下面是一个更复杂的谓词示例:
"salesCount > 10 and (country='UK' or city='New York')
and attitude not in (MENACING, RUDE)
and product.name <> 'Widget' "
(此示例假定应用谓词的类(例如 SalesPerson
类)具有方法 getSalesCount()、getCountry() 和 getCity(),以及 getAttitude()(返回枚举) . 它还有一个属性 getProduct ,它返回一个带有方法 getName 的类型)。
动机:我们有一个拥有多种语言 API(目前是 Java 和 C#)的客户端-服务器系统;我正在为用户寻找一种与语言无关的方式来指定一个谓词,该谓词过滤一组对象,其确切内容只有服务器进程知道(用 Java 编写)。
【问题讨论】:
调查创建 DSL,尤其是在您的情况下是内部的。 这个帖子可能对***.com/questions/5620985/…有帮助 您似乎在寻找类似 LINQ 的东西,但似乎还不存在。也许你会在这里找到一些东西:***.com/questions/1217228/… @Pache - 有点,除了我不需要语言支持 - 我正在寻找在运行时将整个表达式作为字符串提供的东西。我认为 LINQ 是一个编译表达式。 刚刚阅读入门指南 - 它看起来确实像我所追求的!你应该把它放在一个答案中...... 【参考方案1】:我会看看MVEL。它支持类似的表达式:
(user.name == 'John Doe') && ((x * 2) - 1) > 20
曾经在一个项目中使用它来表达客户的一些基本业务规则。
【讨论】:
谢谢!现在我知道我正在寻找一种“表达语言”,我在 java-source.net/open-source/expression-languages 找到了很多其他的东西 它还支持所谓的投影/折叠和过滤,这可能对您的情况有用:familyMembers = (name in (familyMembers in users));
($ in fooList if $.name contains 'foobie');
【参考方案2】:
不确定此类库是否已经存在,但您可以使用 groovy 即时编译/评估此类表达式。
【讨论】:
以上是关于是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?的主要内容,如果未能解决你的问题,请参考以下文章
是否有类似于 First 的 SQL 标准关键字,仅用于 Last