PostgreSQL中包含特殊字符的全文搜索异常



我试图通过搜索文本获得对象列表。如果我继续使用特殊的字符串ex,

searchText ="Agenya\&&";
像这样的

查询(我使用Postgres的全文搜索方法)

select object from Object object where object.Id = :Id and fts('english',object.searchColumn,'Agenya\&&') = true  order by object.objectName asc

我得到这样的异常:

javax.ejb.EJBException: org.hibernate.exception.SQLGrammarException: could not execute query
    at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:63)
    at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
    at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
    at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:304)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:81)
    at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
    at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
    at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
    at $Proxy1152.getAllOpportunitiesBySearchText(Unknown Source)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:2223)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)

请帮我解决这个问题

您正在运行相当过时的Postgres 8.4。 standard_conforming_strings 在此版本中默认设置为off

这给了你什么?

SHOW standard_conforming_strings;

如果您得到off,则字符串中的反斜杠被视为转义字符。从这个问题上我不清楚什么应该是转义字符,什么应该是字面上的反斜杠。

将文字反斜杠加倍并在字符串前加上E,以便它们在转换后继续工作。或者切换到on。一定要先看清楚后果。

还要检查是否有任何软件层将视为转义字符。你可能又得合租了。如果有疑问,请在数据库日志中记录带有log_statement = on的语句,并检查Postgres实际获取的内容。

升级到当前版本的Postgres。


旁白:

在Postgres中,像

这样的表达式
fts(...) = true

…在WHERE子句中可以简化为:

fts(...)

标识符如果没有双引号,则转换为小写。因此:

from Object object

…实际上是在用一种嘈杂的方式说:

from object

:

    PostgreSQL列名是否区分大小写?

最新更新