2016-07-15 51 views
0

我使用SOUNDEX表達式執行以下JPQL結構來執行拼音拼寫匹配。SOUNDEX不使用JPQL使用JPA

StringBuffer nativeQuery = new StringBuffer(); 
nativeQuery.append("SELECT gr FROM CodeMaster gr WHERE gr.id.grcpy = ?1 AND (SOUNDEX(gr.id.sourcecode) = SOUNDEX('").append(searchValue).append("') OR SOUNDEX(gr.sourcedescription) = SOUNDEX'").append(searchValue).append("'))") 
query = getEntityManager().createQuery(nativeQuery.toString()); 

但期間的createQuery它給了我下面的錯誤。請讓我知道如果任何事情我做錯了這裏。如果ireplace SOUNDEXUPPER它工作正常。另外我運行查詢數據庫結果正常提取。

SystemErrřoptimum.clinicals.waf.GeneralFailureException: org.apache.openjpa.persistence.ArgumentException: 「遇到 」SOUNDEX(「 在字符68,但預期:[」(」, 「)」 ,「*」,「+」,「 - 」, 「。」,「/」,「:」,「<」,「< =」,「<>」,「=」,「>」, =「,」?「,」ABS「,」ALL「, 」AND「,」ANY「,」AS「,」ASC「,」AVG「,」BETWEEN「,」BOTH「,」BY「 「 」COUNT「」CURRENT_DATE「」CURRENT_TIME「」CURRENT_TIMESTAMP「 」DELETE「」DESC「DISTINCT」EMPTY「ESCAPE」EXISTS「FETCH」 「 FROM「,」GROUP「,」HAVING「,」IN 「」,「INDEX」,「INNER」,「IS」,「JOIN」, 「KEY」「LEADING」「LEFT」「LENGTH」「LIKE」「LOCATE」「LOWER」 「ORDER」,「OUTER」,「SELECT」,「ORDER」,「MIN」,「MOD」,「NEW」,「NOT」,「NULL」,「OBJECT」,「OF」,「OR」, 「 ,「SET」,「尺寸」,「某些」,「SQRT」, 「SUBSTRING」「SUM」「TRAILING」「TRIM」「TYPE」「UPDATE」「UPPER」 ,「WHERE」,,,, ,,,, ,,]。「而解析 JPQL」SELECT i FROM InformationSource i WHERE i.id.companynumber =?1 AND(SOUNDEX(i.id.sourcecode)LIKE? 2或SOUNDEX(i.sourcedescription) LIKE?2 ORDER BY i.id.sourcecode「。查看原始 解析錯誤的嵌套堆棧跟蹤。

回答

0

由於消息說得不夠清楚SOUNDEX不是有效的JPQL關鍵字/函數。如果您確實需要調用專有的SQL函數,則使用FUNCTION關鍵字(如果使用JPA 2.1)。在將任何SQL轉儲到JPQL查詢之前,最好還是先閱讀some JPQL documentation。 JPQL!= SQL。

0

查看Apache commons Metaphone utils。這些實用程序類在其soundex變體中轉換字符串,所以您不必向JPQL詢問此操作,通過JPA使用專有函數並不好。