簡體   English   中英

PostgreSQL中帶有特殊字符的全文搜索例外

[英]Full text search exception with special characters in 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中的CaMeL-case標識符,並避免麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM