Java 如何逃离'';HQL中的符号
任何人都可以帮助摆脱HQL中的NOT(!)符号。我正在使用Postgres 8.3。此外,我无法使用这些字符搜索() 您应该选择搜索文本,而不是手动将其连接到查询。它不仅解决了您的问题,而且在安全性(SQL注入)和性能方面也更好(数据库使用不同的参数查看相同的查询,这允许它在可能的情况下缓存已编译的查询) 更改查询,使其看起来像:Java 如何逃离'';HQL中的符号,java,hibernate,postgresql,hql,criteria,Java,Hibernate,Postgresql,Hql,Criteria,任何人都可以帮助摆脱HQL中的NOT(!)符号。我正在使用Postgres 8.3。此外,我无法使用这些字符搜索() 您应该选择搜索文本,而不是手动将其连接到查询。它不仅解决了您的问题,而且在安全性(SQL注入)和性能方面也更好(数据库使用不同的参数查看相同的查询,这允许它在可能的情况下缓存已编译的查询) 更改查询,使其看起来像: fts('english', COLUMN_NAME, :searchText) = true // using named parameters // or fts
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();
这与在JDBC中使用PreparedStatement
并设置参数的原理相同(主要区别在于参数的索引从JDBC的1开始,从HQL的0开始)。您应该是搜索文本,而不是手动将其连接到查询。它不仅解决了您的问题,而且在安全性(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();
这与在JDBC中使用
PreparedStatement
并设置参数的原理相同(主要区别在于参数的索引从JDBC的1开始,从HQL的0开始)。我想这个标题是误导性的。您应该阅读SQL注入指南并查看整个代码库。我想这个标题是有误导性的。你应该阅读一本关于SQL注入的指南,并回顾一下你的整个代码库。我仍然得到以下错误。原因:org.postgresql.util.PSQLException:错误:tsquery:“!”中没有操作数。这是因为您没有将有效查询传递给全文搜索。这是PostgreSQL问题,不是Hibernate问题。全文搜索通常会进行词干分析,因此标点符号将被删除,您将无法将其包含在搜索中。也许您应该使用将搜索文本包装到正确的查询中。@RamarajkarupusAMY For SQL injection请参阅,我仍然收到以下错误。原因:org.postgresql.util.PSQLException:错误:tsquery:“!”中没有操作数。这是因为您没有将有效查询传递给全文搜索。这是PostgreSQL问题,不是Hibernate问题。全文搜索通常会进行词干分析,因此标点符号将被删除,您将无法将其包含在搜索中。也许您应该使用将搜索文本包装成正确的查询。@RamarajkarupusAMY For SQL injection请参阅和