Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在寻找从Java中给定的SQL查询创建动态SQL的方法_Java_Sql_Hibernate_Dynamic - Fatal编程技术网

正在寻找从Java中给定的SQL查询创建动态SQL的方法

正在寻找从Java中给定的SQL查询创建动态SQL的方法,java,sql,hibernate,dynamic,Java,Sql,Hibernate,Dynamic,作为工作流引擎的一部分,我正在实现一个通用的数据库步骤,该步骤将执行任何给定的SQL查询并以XML形式返回结果。此工作流可以动态配置,因此传递到执行层的查询将是一个完全限定的静态SQL查询,例如,SELECT*FROM USER,其中USERID=10。这种方法的缺点是数据库每次运行时都编译查询。是否有一种方法可以通过编程方式从查询创建动态SQL查询。Java或类似Hibernate的JPA支持这样的功能吗 通常,您需要使用绑定变量对查询模板的输入进行参数化。绑定变量有两种形式,即:i)未命名绑

作为工作流引擎的一部分,我正在实现一个通用的数据库步骤,该步骤将执行任何给定的SQL查询并以XML形式返回结果。此工作流可以动态配置,因此传递到执行层的查询将是一个完全限定的静态SQL查询,例如,SELECT*FROM USER,其中USERID=10。这种方法的缺点是数据库每次运行时都编译查询。是否有一种方法可以通过编程方式从查询创建动态SQL查询。Java或类似Hibernate的JPA支持这样的功能吗

通常,您需要使用绑定变量对查询模板的输入进行参数化。绑定变量有两种形式,即:i)未命名绑定变量(或位置绑定变量);ii)命名绑定变量

SELECT * FROM USER WHERE USERID = 10
这可以通过vanilla JDBC完成。我发现SpringJDBC特别容易操作。具体来看JDBCTemplate接口及其实现

我同意用户KuriosCoder的观点,即应该使用绑定变量。这适用于普通JDBC。大多数RDBMS都有一个游标缓存,如果查询相同(即没有内联变量),它会将查询的解析版本以及执行计划都保存在内存中。因此,解析器的开销将是最小的

就XML输出而言,我可以推荐(我是开发人员)。在即将发布的1.6.2版中,我将添加各种格式(XML、HTML、JSON、CSV)的导出功能。您的查询将使用jOOQ的fluent API构建,如下所示:

String xml = create.selectFrom(USER)
                   .where(USERID.equal(10))
                   .fetch()
                   .formatXML();
输出如下所示(可以将XSL转换为任何其他格式):


...
1.
卢卡斯
埃德尔
...
...

有关更多详细信息,请参见

如果我理解您的要求,那么您应该看看ExperiedB-这是一个相当小的项目,但至少在我使用它时,它得到了积极和有益的支持。它类似于python的sqlalchemy,因为它允许您使用语言中的类和函数构造sql查询

引用链接:

类型安全、无字符串且直观的API。构建任何SQL语句,包括select子句,并将其用于任何POJO,而不仅仅是功能齐全的实体bean


我在一个项目中使用MyBatis来获得非常相似的行为。 还可以查看以获取完整信息

在MyBatis中,您可以使用动态SQL定义查询;您可以将包含属性(例如POJO或映射)的对象传递给SqlMapClient,并在查询文本中使用它们,如下所示:

  • #参数#(如准备好的报表中的?)
  • $variables$直接成为SQL字符串的一部分
  • 动态SQL功能,包括基于属性值的SQL部分
然后,SQL映射器将执行查询并返回Java对象:如果查询返回的记录已知,则可以将列映射到POJO;否则,在MyBatis中,您可以将HashMap作为结果类,并最终通过SqlMapClient的queryWithRowHandler()方法使用处理程序处理每个记录,以对返回的数据进行后期处理


一旦您至少有了查询的HashMap表示,您就可以轻松地将其转换为XML。

这个问题的首要答案可能就是您想要的:如果我知道查询模板的编译时间,我可以将查询参数化。在我的例子中,我将得到一个包含所有变量集的完整查询。如何从已填充的查询中提取模板?打个比方,假设我正在为数据库编写一个GUI,用户可以执行任何随机查询,但大多数情况下都会重复查询,这给优化留下了机会。当我得到一个输入查询“SELECT*FROM user WHERE user\u ID=10”时,我应该能够生成一个准备好的语句“SELECT*FROM user WHERE user\u ID=?”确定我需要将第一个位置的参数设置为integer类型的10。如果这只是您提到的一种情况,那么就进行字符串解析。如果要使其成为任何查询的通用查询,则需要使用自己的SQL语法实现解析器
<result>
  <fields>
    <field name="USERID"/>
    <field name="FIRSTNAME"/>
    <field name="LASTNAME"/>
    ...
  </fields>
  <records>
    <record>
      <value field="USERID">1</value>
      <value field="FIRSTNAME">Lukas</value>
      <value field="LASTNAME">Eder</value>
      ...
    </record>
    ...
  </records>
</result>