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

标签 java sql el predicate lambdaj

Lambdaj(和其他一些类似的库)提供了一个 having 函数,它允许我像这样定义谓词(示例直接来自 lambdaj Features 页面):

List<Person> oldFriends = 
    filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);

我非常希望能够使用简单的字符串语法定义我的 Java 谓词对象,"age > 30" - 类似于 SQL where 子句 - 所以上面的过滤器变成类似:

List<Person> oldFriends = 
    filter(having(Person.class, "age > 30"), meAndMyFriends);

是否存在这样的库,或者任何人都可以为我自己构建一个可以用来构建查询解析部分的构建 block 推荐一些构建 block 吗?我实际上并不介意它创建什么样的谓词(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 和 C#)的客户端-服务器系统;我正在寻找一种与语言无关的方式,让用户指定一个谓词来过滤一组对象,这些对象的确切内容只有服务器进程(用 Java 编写)知道。

最佳答案

我会看一下 MVEL .它支持类似的表达:

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

曾经在一个项目中使用它来表达来自客户的一些基本业务规则。

关于java - 是否有用于将谓词定义为类似 SQL 的字符串的 Java 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13237998/

相关文章:

java - 在java中传递sonar的PT_RELATIVE_PATH_TRAVERSAL

mysql - SQL查询获取用户排名

jsf - InputText 绑定(bind)到空双字段当前 "0.0"

java - 如何在 JavaFX 中访问对象的子对象

java - 如何在java中追加URL

Java switch 足够智能来重新排列吗?

SQL Server Rank() 按组

sql - 为查询字符串声明变量

java - 表达式语言中的 renderRequest

jsp - 直接在EL中访问Java类的字段