我有以下要求, 我需要公开一个 API,用户可以在其中发送自由形式的“查询”之类的表达式,并且我需要返回 true/false。 例如:对于汽车对象,如果查询是
" (make = 'FORD' AND year IN (1990,1991)) OR type = 'SUV') ".
但是,“make”、“year”或“type”来自外部填充的表。
TABLE CAR_PROPERTIES (
propertyName VARCHAR2(40),
propertyValue VARCHAR2(10)
)
我首先遍历其他连接表来加载属性。
所以,如果有新的属性(和相应的值),我需要在查询中支持。
到目前为止,这就是我所做的:
如果不需要向类添加动态属性,我知道我 可以在我的 Collection 中使用像 JoSQL 这样的东西。
一旦应用程序使用 Java Tools API 或 javaassist 启动,我就会考虑动态创建该类。
客户端坚持采用不需要添加新属性和部署代码的解决方案(尽管此 API 的“调用者”确实需要更改代码才能在查询中使用新属性)。
我不喜欢动态创建新类。寻找任何指示或解决方案。
最佳答案
Raj - 只是为您的设计提供一些建议和灵感:
甚至不会进行完整的 O/R 映射。我会考虑将您的领域特定语言翻译成 SQL。我用Python做过这样的事情。这要容易得多,因为您正在两种简单语言(自定义 DSL 和 SQL)之间进行语言到语言的翻译。通过强大的正则表达式,您可以拥有一个非常简洁且强大的框架来处理此类交互。 (参见 Regex Table Lexer 和其他模式)
有一些有趣的设计值得研究:
OData API 允许用户使用 RESTful“代数”来使用客户表达式查询数据 OData4J 处理映射 http://code.google.com/p/odata4j/
查询DSL: http://blog.mysema.com/2011/01/querying-in-sql-with-querydsl.html
对于动态关系和属性表达式,我建议(嵌入)图数据结构 这是一个有用的教程,显示了相对图映射:
http://py2neo.org/tutorials/tables_to_graphs
以及 Neo4J 的教程,我将其用于类似目的:
http://docs.neo4j.org/chunked/stable/tutorials.html
关于java - 使用表数据在java中动态创建一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11769765/