【问题标题】:Escaping special character in Hibernate select query with fts使用 fts 在 Hibernate 选择查询中转义特殊字符
【发布时间】:2013-04-30 04:25:51
【问题描述】:

我有这样的查询

 Query query = session.createQuery("select object from EntityObject object where lower(object.columnName) like lower (E'%\\(test\\)%')");

Query query = session.createQuery("select object from EntityObject object where fts('english',contact.searchColumn,'testing (test)') = true;

我正在尝试使用反斜杠转义搜索文本中的特殊字符,并且我正在使用 postgres 8.3 和 standard_conforming_strings 处于开启状态。通过使用“E”,我收到错误

意外的标记:第一种情况的第 1 行附近的 '%\(test\)%'

并在下一个案例中低于错误

错误:tsquery 中的语法错误:“测试(测试)”

请帮我解决这个问题。我的意图是转义特殊字符,尤其是带反斜杠的括号“()”。

【问题讨论】:

  • 为什么你的like子句在单引号外面有一个“E”?
  • 我尝试转义此处指定的特殊字符postgresql.org/docs/current/interactive/…“如果应用程序希望将反斜杠视为转义字符,则应使用转义字符串语法。”
  • 您尝试过使用限制吗?
  • 不,我没有尝试使用限制我想在这种方法中这样做。
  • 我认为你需要在你的 postgresql 数据库中设置 standard_conforming_strings=on。但我怀疑你可以通过编程方式做到这一点

标签: java hibernate postgresql


【解决方案1】:

函数lower 需要一个字符串作为参数。 E'%\\(test\\)%' 不是有效字符串,因为开头没有单个 ''E%\\(test\\)%' 将是一个正确的字符串 - 我想我想知道你想用它做什么,它在 HQL 中和 SQL 中都不是正确的转义。

like 语句中只有两个特殊的通配符,_%。如果你想转义它们,你必须定义一个转义字符。

示例:选择名称以下划线_开头的所有行

from YourTable where name like '!_%' escape '!'

如果您想在 SQL 中的任何位置转义 '(不仅是 like 语句),那么您必须输入两次。

示例:选择名称为Peter's的行

from YourTable where name = 'Peter''s'

【讨论】:

  • 实际上我正在尝试转义括号“()”,因为我试图用反斜杠附加它,然后我想转义该字符串中的特殊字符。而您的代码“来自 YourTable 中的名称,例如 ' !_%' escape '!'" - 没有为我获取结果。
  • 您不需要转义括号。它们在 HQL like 语句中没有任何特殊含义。
  • 是的,谢谢你喜欢我们不需要转义括号,但在 tsquery('english', 'testing (test)')=true 我们需要对吗?你能告诉我在 ts_query 中的方法吗?
  • tsquery 是 Postgresql 的专长。它既不是 HQL 也不是标准 SQL。在 HQL 语句中使用时可能不起作用。使用createSqlQuery() 而不是createQuery(),您可以使用与SQL 中完全相同的语法。然后,您将失去对其他数据库的可移植性,但无论如何在使用 tsquery 时就是这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2016-01-14
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多