【发布时间】: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,尤其是在您的情况下是内部的。
-
这个帖子可能对stackoverflow.com/questions/5620985/…有帮助
-
您似乎在寻找类似 LINQ 的东西,但似乎还不存在。也许你会在这里找到一些东西:stackoverflow.com/questions/1217228/…
-
@Pache - 有点,除了我不需要语言支持 - 我正在寻找在运行时将整个表达式作为字符串提供的东西。我认为 LINQ 是一个编译表达式。
-
刚刚阅读入门指南 - 它看起来确实像我所追求的!你应该把它放在一个答案中......
标签: java sql el predicate lambdaj