我不是在寻找像Hibernate这样的持久层,我只想生成sql-strings,它们应该兼容PreparedStatement.我已经尝试了像Squiggle这样的库,但它只支持SELECT,我还想生成插入和更新.理想的用法是:
generateInsertOn("myTable").addValue("value1").addValue("value2").generate();
Run Code Online (Sandbox Code Playgroud)
会产生这个字符串:
"INSERT INTO myTable (value1, value2) VALUES(?, ?)"
Run Code Online (Sandbox Code Playgroud)
我知道,有存在很多像我这样的,如题本,但他们不相当问同样的事情,和我一样.
干杯,
Lambdaj(以及其他一些类似的库)提供了一个having函数,它允许我像这样定义谓词(例如直接来自lambdaj Features页面):
List<Person> oldFriends =
filter(having(on(Person.class).getAge(), greaterThan(30)), meAndMyFriends);
Run Code Online (Sandbox Code Playgroud)
我非常希望能够使用简单的字符串语法定义我的Java谓词对象"age > 30"- 类似于SQL where子句 - 所以上面的过滤器变成了类似的东西:
List<Person> oldFriends =
filter(having(Person.class, "age > 30"), meAndMyFriends);
Run Code Online (Sandbox Code Playgroud)
这样的库是否存在,或者是否有人可以为我自己构建一个查询解析部分推荐一些构建块?我实际上并不介意它创造了什么样的谓词(hamcrest,guava等).
在我的头脑中,我可以想到它支持的许多事情:平等和不平等,自定义和原始类型,和/或/不,括号,LIKE(对于字符串),in(...)enum的解释名称,属性的属性.
这是一个更复杂的谓词的例子:
"salesCount > 10 and (country='UK' or city='New York')
and attitude not in (MENACING, RUDE)
and product.name <> 'Widget' "
Run Code Online (Sandbox Code Playgroud)
(此示例假定谓词应用于的SalesPerson类(比如一个类)具有方法getSalesCount(),getCountry()和getCity(),以及getAttitude()(返回枚举).它还具有属性getProduct,返回带有getName方法的类型.
动机:我们有一个客户端 - 服务器系统,它有多种语言API(目前是Java和C#); 我正在寻找一种语言无关的方式让用户指定一个谓词,该谓词过滤一组对象,其中的确切内容只有服务器进程知道(用Java编写).
在寻找 Java 库以与数据库无关的方式构建查询时,我遇到了许多库,包括 iciql、querydsl、jooq、joist、hibernate 等。
我想要一些不需要配置文件并且可以使用动态模式的东西。对于我的应用程序,我在运行时了解数据库和模式,因此我不会有任何配置文件或模式的域类。
这似乎是 querydsl 的核心目标之一,但是通过 querydsl 的文档,我看到了很多使用域类构建动态查询的示例,但我没有遇到任何解释如何仅使用我有关于架构的动态信息。
Jooq 提供了这样的功能(参见:http : //www.jooq.org/doc/3.2/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder/)但有一个限制性许可证,如果我想将我的注意力扩展到 Oracle 或 MS SQL(我可能不喜欢但需要支持)。
有 querydsl 经验的人可以让我知道 querydsl 是否可以实现这样的事情,如果可以,如何实现。
如果有人知道任何其他可以满足我的要求的人,我将不胜感激。