【问题标题】:How to escape from '!' symbol in HQL如何逃离'!' HQL 中的符号
【发布时间】:2012-09-14 17:34:11
【问题描述】:

任何人都可以帮助摆脱 HQL 中的 NOT(!) 符号。我正在使用 Postgres 8.3。我也无法用这些字符搜索 |\?'( )

fts('english',COLUMN_NAME,'" + searchText + "') = true)

【问题讨论】:

标签: java hibernate postgresql hql criteria


【解决方案1】:

您应该是binding 搜索文本,而不是手动将其连接到查询。它不仅解决了您的问题,而且在安全性(SQL 注入)和性能方面也更好(数据库看到具有不同参数的相同查询,这允许它尽可能缓存已编译的查询)。

更改您的查询,使其看起来像:

fts('english', COLUMN_NAME, :searchText) = true // using named parameters
// or
fts('english', COLUMN_NAME, ?) = true // using positional parameters

然后您可以正确绑定参数:

session.createQuery(hqlQuery)
        .setString("searchText", searchText)
        .iterate();
// or
session.createQuery(hqlQuery)
        .setString(0, searchText)
        .iterate();

这与使用 PreparedStatement 和 JDBC 并设置参数的原理相同(主要区别在于参数的索引在 JDBC 和 HQL 中从 1 开始)。

【讨论】:

  • 我仍然收到以下错误。原因:org.postgresql.util.PSQLException:错误:tsquery 中没有操作数:“!”。
  • 那是因为您没有将有效的查询传递给全文搜索。这是一个 PostgreSQL 问题,而不是 Hibernate 问题。全文搜索通常会进行词干提取,因此标点符号将被删除,您将无法将其包含在搜索中。也许您应该使用to_tsquery() 将您的搜索文本包装成正确的查询。
  • @RamarajKaruppusamy 对于 SQL 注入,请参阅 en.wikipedia.org/wiki/SQL_injectionbobby-tables.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
相关资源
最近更新 更多