2016-07-15 73 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使用专有函数并不好。