0

我正在尝试通过搜索文本获取对象列表。如果我使用特殊字符串进行此操作,例如

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)

请帮我解决这个问题。

4

1 回答 1

0

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

这给了你什么?

SHOW standard_conforming_strings;

如果你得到off,字符串中的反斜杠将被视为转义字符。从这个问题中我不清楚什么应该是转义字符,什么应该是文字反斜杠。相应地清理你的字符串。

将文字反斜杠加倍并在字符串前面加上,E以便它们在切换后继续工作。或切换到on. 请务必先了解后果。

还要检查您的任何软件层是否也被\视为转义字符。你可能不得不再次加倍。如果有疑问,log_statement = on请在数据库日志中记录语句并检查 Postgres 实际获取的内容。

升级到当前版本的 Postgres。


旁白:

在 Postgres 中,表达式如下:

fts(...) = true

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

fts(...)

如果没有双引号,标识符将转换为小写。所以:

from Object object

...实际上只是一种嘈杂的说法:

from object

看:

于 2013-04-24T01:28:46.020 回答