是否有用于将谓词定义为类似SQL的字符串的Java库?

时间:2012-11-05 18:19:50

标签: java sql el predicate lambdaj

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( for Strings),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&amp; C#);我正在寻找一种语言无关的方式让用户指定一个谓词,该谓词过滤一组对象,其中的确切内容只有服务器进程知道(用Java编写)。

2 个答案:

答案 0 :(得分:2)

我会看看MVEL。它支持类似的表达式:

(user.name == 'John Doe') && ((x * 2) - 1) > 20

在项目中使用它一次,以表达客户的一些基本业务规则。

答案 1 :(得分:0)

不确定此库是否已存在,但您可以使用groovy动态编译/评估此类表达式。