【问题标题】:Get SQL String substituted with parameters using java使用java获取用参数替换的SQL字符串
【发布时间】:2016-02-19 02:54:03
【问题描述】:

有没有什么简单的方法可以在参数替换后得到完整的 SQL 语句?

我正在使用 elasticsearch-sql 通过 sql 语句查询弹性搜索,但是我必须提交替换所有参数的查询。

我尝试了 Hibernate Query getQueryString,但这些 sql 字符串没有发生参数替换。

产生以下sql字符串:

“SELECT * FROM USER WHERE NAME=? AND SURNAME=?”

而不是:

"SELECT * FROM USER WHERE NAME='Selva' AND SURNAME='Esra'

欣赏任何更好的想法/想法?

【问题讨论】:

  • 不知道你在问什么,你是怎么得到第一个 sql 字符串的?
  • 它是一个动态 sql - sql 查询是在运行时基于一些逻辑、前置条件等生成的 不幸的是,当构造 sql 查询时我不能直接替换参数
  • 我不确定我是否真的遵循.. 为什么这样的东西不起作用? "SELECT * FROM USER WHERE NAME=? AND SURNAME=?".replace("NAME=?", "NAME='Selva'").replace("SURNAME=?", "SURNAME='Esra'");
  • 在您的 Hibernate Queryobject 上,您不仅可以获取查询字符串,还可以使用 getParameters() 获取参数列表。然后,您可以将所有? 替换为集合中的每个参数。

标签: java oracle hibernate elasticsearch


【解决方案1】:

1.命名参数

这是最常见且用户友好的方式。它使用冒号后跟参数名称 (:example) 来定义命名参数。查看示例...

String hql = "SELECT * FROM USER WHERE NAME= :userName AND SURNAME= :surName";
Query query = session.createQuery(hql);
query.setParameter("userName ", "userName");
query.setParameter("surName", "SurName");
List results = query.list();

Hibernate 查询的面向对象表示。通过调用 Session.createQuery() 获得一个 Query 实例。这个接口暴露了一些超出 Session.iterate() 和 Session.find() 提供的额外功能:

可以通过调用 setMaxResults()、setFirstResult() 来选择结果集中的特定页面 可以使用命名查询参数 结果可以作为 ScrollableResults 的实例返回

Named query parameters are tokens of the form :name in the query string. A value is bound to the integer parameter :foo by calling

setParameter("foo", foo, Hibernate.INTEGER);

例如。一个名称可能在查询字符串中出现多次。

JDBC 风格?也支持参数。要将值绑定到 JDBC 样式参数,请使用接受 int 位置参数(从零开始编号,与 JDBC 相反)的 set 方法。

您不能在同一查询中混合和匹配 JDBC 样式参数和命名参数。

2。位置参数

使用问号(?)来定义一个命名参数,你必须按照位置顺序来设置你的参数。见例子…… 爪哇

String hql = "from Stock s where s.stockCode = ? and s.stockName = ?";
List result = session.createQuery(hql)
.setString(0, "7277")
.setParameter(1, "DIALOG")
.list();

这种方法不支持 setProperties 函数。此外,由于绑定参数位置的每次更改都需要更改参数绑定代码,因此它很容易被破坏。 爪哇

String hql = "from Stock s where s.stockName = ? and s.stockCode = ?";
List result = session.createQuery(hql)
.setParameter(0, "DIALOG")
.setString(1, "7277")
.list();

结论

在 Hibernate 参数绑定中,我建议始终使用“命名参数”,因为它更易于维护,并且编译后的 SQL 语句可以重复使用(如果只是绑定参数更改)以提高性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2015-05-01
    • 2013-07-09
    • 2014-08-09
    • 1970-01-01
    • 2012-05-20
    • 2017-08-04
    相关资源
    最近更新 更多