我有以下带有SOUNDEX表达式的JPQL结构来执行语音拼写匹配。
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期间它给了我以下错误..如果我在这里做错了,请告诉我。如果用 UPPER 替换 SOUNDEX ,它可以正常工作。另外我运行查询数据库结果正常获取。
SystemErr R optimal.clinicals.waf.GeneralFailureException: org.apache.openjpa.persistence.ArgumentException:“遇到了 “SOUNDEX(”字符68,但预期:[“(”,“)”,“*”,“+”,“ - ”, “。”,“/”,“:”,“<”,“< =”,“<>”,“=”,“>”,“> =”,“?”,“ ABS“,”ALL“, “AND”,“ANY”,“AS”,“ASC”,“AVG”,“BETWEEN”,“BOTH”,“BY”,“CONCAT”, “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”,“MAX”, “MEMBER”,“MIN”,“MOD”,“NEW”,“NOT”,“NULL”,“OBJECT”,“OF”,“OR”, “ORDER”,“OUTER”,“SELECT”,“SET”,“SIZE”,“SOME”,“SQRT”, “SUBSTRING”,“SUM”,“TRAILING”,“TRIM”,“TYPE”,“UPDATE”,“UPPER”, “VALUE”,“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 :(得分:0)
正如消息所说明的那样,Android Studio
不是有效的SOUNDEX
关键字/功能。如果您确实需要调用专有JPQL
函数,请使用SQL
关键字(如果使用JPA 2.1)。更好的方法是在将任何SQL转储到JPQL查询之前阅读some JPQL documentation。 JPQL!= SQL。
答案 1 :(得分:0)
查看Apache commons Metaphone utils。这些实用程序类在其soundex变体中转换字符串,因此您不必向JPQL请求此操作,通过JPA使用专有函数是不好的。