SOUNDEX不能使用JPQL使用JPA

时间:2016-07-15 06:46:55

标签: java jpa persistence jpql

我有以下带有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“。请参阅嵌套堆栈跟踪原始版本   解析错误。

2 个答案:

答案 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使用专有函数是不好的。