mysql - 将 SQL 翻译成 JPQL

标签 mysql sql jpql openjpa

我很难弄清楚如何将以下 SQL 转换为 JPQL

SELECT * FROM consorder
WHERE
    consorder.redistid LIKE '123%'
HAVING
    MAX(consorder.redistid)    

(在 MySQL 下就像一个魅力)。

@Query("select c from ConsignmentOrder c" +
       " where c.redistributionId like ?1" +
       " having max(c.redistributionId)")

我得到以下异常:

Caused by: <openjpa-2.2.2-r422266:1468616 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Encountered "max ( c . redistributionId     ) <EOF>" at character 79, but expected: ["(", ")", "*", "+", "-", ".", "/", ":", "<", "<=", "<>", "=", ">", ">=", "?", "ABS", "ALL", "AND", "ANY", "AS",     "ASC", "AVG", "BETWEEN", "BOTH", "BY", "CASE", "COALESCE", "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", "NULLIF", "OBJECT", "OF", "OR", "ORDER", "OUTER", "SELECT", "SET",     "SIZE", "SOME", "SQRT", "SUBSTRING", "SUM", "TRAILING", "TRIM", "TYPE", "UPDATE", "UPPER", "VALUE", "WHERE", <BOOLEAN_LITERAL>, <DATE_LITERAL>, <    DECIMAL_LITERAL>, <IDENTIFIER>, <INTEGER_LITERAL>, <STRING_LITERAL2>, <STRING_LITERAL>, <TIMESTAMP_LITERAL>, <TIME_LITERAL>].
        at org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:13162)
        at org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:13036)
        at org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1980)
        at org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1958)
        at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1807)
        at org.apache.openjpa.kernel.jpql.JPQL.conditional_expression(JPQL.java:1769)
        at org.apache.openjpa.kernel.jpql.JPQL.having_clause(JPQL.java:1701)
        at org.apache.openjpa.kernel.jpql.JPQL.select_statement(JPQL.java:107)
        at org.apache.openjpa.kernel.jpql.JPQL.parseQuery(JPQL.java:63)
        at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.parse(JPQLExpressionBuilder.java:2401)
        at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.<init>(JPQLExpressionBuilder.java:2388)
        at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:49)
        ... 96 moreEncountered "max ( c . redistributionId ) <EOF>" at character 79, but expected: ["(", ")", "*",

我们将不胜感激。

编辑: 我稍微重组了查询:

 @Query("select c from ConsignmentOrder c where c.redistributionId = (select max(co.redistributionId) from (select co ConsignmentOrder co where co.redistributionId like ?1) as tmp )")

现在异常类似:

Caused by: <openjpa-2.2.2-r422266:1468616 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Encountered "c . redistributionId = ( select max ( co . redistributionId ) from (" at character 40, but expected: ["(", ")", "*", "+", ",", "-", ".", "/", ":", "<", "<=", "<>", "=", ">", ">=", "?", "ABS", "ALL", "AND", "ANY", "AS", "ASC", "AVG", "BETWEEN", "BOTH", "BY", "CASE", "CLASS", "COALESCE", "CONCAT", "COUNT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DELETE", "DESC", "DISTINCT", "ELSE", "EMPTY", "END", "ENTRY", "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", "NULLIF", "OBJECT", "OF", "OR", "ORDER", "OUTER", "SELECT", "SET", "SIZE", "SOME", "SQRT", "SUBSTRING", "SUM", "THEN", "TRAILING", "TRIM", "TYPE", "UPDATE", "UPPER", "VALUE", "WHEN", "WHERE", <BOOLEAN_LITERAL>, <DATE_LITERAL>, <DECIMAL_LITERAL>, <IDENTIFIER>, <INTEGER_LITERAL>, <STRING_LITERAL2>, <STRING_LITERAL>, <TIMESTAMP_LITERAL>, <TIME_LITERAL>].

没有误导性的 EOF

最佳答案

将其转换为 JPQL 很重要吗?您可以轻松地在 JPA 中运行 native SQL

使用实体管理器中存在的 createNativeQuery() 方法,您可以使用 SQL 语法创建可执行查询

关于mysql - 将 SQL 翻译成 JPQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24187714/

相关文章:

php - 更新当前数据库表

php - 使用 api 调用更新 laravel 中的值

sql - 使用选择查询加入 postgres 中的系列

mysql - sql 将产品所有者表分组,其中包含主要所有者和串联的次要所有者的列

java - 使用@Query 在 ElasticSearch 中设置大小

java - 异常描述: Syntax error parsing

php - 来自数据库的数据与 htmlentities 相呼应,在希伯来语中给出了奇怪的迹象

mysql - 无法创建存储过程,但其中的所有内容都运行得很好

sql - 如何强制oracle在不删除/重新创建约束的情况下进行级联删除

subquery - JPQL/QueryDSL : join subquery and get aliased column