SOUNDEX 不能使用 JPQL 与 JPA 一起工作

Posted

技术标签:

【中文标题】SOUNDEX 不能使用 JPQL 与 JPA 一起工作【英文标题】:SOUNDEX is not working with JPA using JPQL 【发布时间】:2016-11-18 06:37:47 【问题描述】:

我有以下带有 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 期间,它给了我以下错误。如果我在这里做错了什么,请告诉我。如果将 SOUNDEX 替换为 UPPER,则效果很好。我还对数据库结果进行了查询,结果正常获取。

SystemErr R 最佳.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”、 “成员”、“MIN”、“MOD”、“NEW”、“NOT”、“NULL”、“OBJECT”、“OF”、“OR”、 “订单”、“外部”、“选择”、“设置”、“尺寸”、“某些”、“SQRT”、 “SUBSTRING”、“SUM”、“TRAILING”、“TRIM”、“TYPE”、“UPDATE”、“UPPER”、 “价值”,“在哪里”,,,, , , , , , , ]." 解析时 JPQL“从信息源中选择 i 在哪里 i.id.companynumber=?1 AND (SOUNDEX(i.id.sourcecode) LIKE ?2 OR SOUNDEX(i.sourcedescription) LIKE ?2 ORDER BY i.id.sourcecode”。请参阅嵌套堆栈跟踪以获取原始信息 解析错误。

【问题讨论】:

【参考方案1】:

正如消息所言,SOUNDEX 不是有效的 JPQL 关键字/函数。如果您确实需要调用专有的 SQL 函数,请使用 FUNCTION 关键字(如果使用 JPA 2.1)。在将任何 SQL 转储到 JPQL 查询之前,最好阅读some JPQL documentation。 JPQL != SQL。

【讨论】:

【参考方案2】:

查看 Apache commons Metaphone 实用程序。这些实用程序类在其 soundex 变体中转换字符串,因此您不必要求 JPQL 进行此操作,通过 JPA 使用专有功能是不好的。

【讨论】:

以上是关于SOUNDEX 不能使用 JPQL 与 JPA 一起工作的主要内容,如果未能解决你的问题,请参考以下文章

清除与 JPA / JPQL 的多对多关系

JPA 2.1 @ConstructorResult 和 @SqlResultSetMapping 与 JPQL SELECT NEW SomeConstructor(...) 相比有啥优势?

Spring Boot JPA:为同一参数传递多个值 (JPQL)

Spring JPA 和 Hibernate 的 JPQL 查询错误

JPA 多对多JPQL查询语句怎么写?

如何以编程方式验证 JPQL(JPA 查询)