JPA CONCATE 与 IN 运算符一起使用时抛出异常

Posted

技术标签:

【中文标题】JPA CONCATE 与 IN 运算符一起使用时抛出异常【英文标题】:JPA CONCATE when used with IN operator throws Exception 【发布时间】:2015-12-18 03:57:30 【问题描述】:

我正在尝试运行一个复杂的 JPQL QUERY,它不会抛出异常并且工作异常。

这是我的查询

SELECT b.pk.col1, b.pk.col2
  FROM table1 b
 WHERE     b.pk.col2 IN ('someString')
       AND b.pk.col3 IN (0, 1, 2)
       AND b.pk.sdate < :now
       AND b.edate > :now
       AND b.col4 = 1
       AND EXISTS
              (SELECT a.cmid
                 FROM table2 a
                WHERE a.col1 = 5 AND a.col2 = b.pk.col1)
       AND b.pk.col1 NOT IN
              (SELECT a.pk.col1
                 FROM table3 a
                WHERE CONCAT (a.pk.tagid, 'ayush') IN ('1ayush'))

由于某种原因,它在最后一行引发错误。这是错误

异常数据:org.apache.openjpa.persistence.ArgumentException: 遇到"b.pk.col1 NOT IN (select a.pk.col1 FROM Table3 a where CONCAT(a.pk.tagId,\'ayush\')IN (" 在第 249 个字符处,但预期为:["(", ")", "*", "+", ",", "-", ".", "/", ":", ""、"="、">"、">="、"?"、"ABS"、"ALL"、"AND"、"ANY"、"AS"、"ASC" , "平均", “BETWEEN”、“BOTH”、“BY”、“CONCAT”、“COUNT”、“CURRENT_DATE”、“CURRENT_TIME”、“CURRENT_TIMESTAMP”、“DELETE”、“DESC”、“DISTINCT”、“EMPTY”、“ESCAPE” "、"存在"、"获取"、"来自"、 “GROUP”、“HAVING”、“IN”、“INNER”、“IS”、“JOIN”、“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", "UPDATE", "UPPER", "WHERE", , , , , ]。

为了清楚起见,我将查询分成多行:

这是一行中的查询

    SELECT b.pk.col1, b.pk.col2
  FROM table1 b
 WHERE     b.pk.col2 IN ('someString')
       AND b.pk.col3 IN (0, 1, 2)
       AND b.pk.sdate < :now
       AND b.edate > :now
       AND b.col4 = 1
       AND EXISTS
              (SELECT a.cmid
                 FROM table2 a
                WHERE a.col1 = 5 AND a.col2 = b.pk.col1)
       AND b.pk.col1 NOT IN
              (SELECT a.pk.col1
                 FROM table3 a
                WHERE CONCAT (a.pk.tagid, 'ayush') IN ('1ayush'))

我忘了提及,如果我尝试使用 = 而不是 IN,则查询有效,但这是一个演示查询,我实际上必须在那里使用 List

编辑: 这是我的新 JPA QUERY,我给它一个集合而不是一些硬编码的值

SELECT b.pk.col1, b.pk.col2
  FROM table1 b
 WHERE     b.pk.col2 IN ('someString')
       AND b.pk.col3 IN (0, 1, 2)
       AND b.pk.sdate < :now
       AND b.edate > :now
       AND b.col4 = 1
       AND EXISTS
              (SELECT a.cmid
                 FROM table2 a
                WHERE a.col1 = 5 AND a.col2 = b.pk.col1)
       AND (b.pk.col1 NOT IN
               (SELECT a.pk.col1
                  FROM table3 a
                 WHERE CONCAT (a.pk.tagid, 'ayush') IN (:somelist)))

我仍然得到同样的异常

异常数据:org.apache.openjpa.persistence.ArgumentException: 遇到“b . pk . col1 NOT IN (select a . pk . col1 FROM Table3 a where CONCAT (a . pk . tagId , \'ayush\') IN" 在字符 249,但预期为:["(", ")", "*", "+", ",", "-", ".", "/", ":", ""、"="、">"、">="、"?"、"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”、“INNER”、“IS”、“JOIN”、“LEADING”、“LEFT” 、“长度”、“喜欢”、“定位”、“下限”、“最大”、“成员”、“最小”、“MOD”、“新”、“不”、“空”、“对象”、“ OF”、“OR”、“ORDER”、“OUTER”、“SELECT”、“SET”、“SIZE”、“SOME”、“SQRT”、“SUBSTRING”、“SUM”、“TRAILING”、“TRIM” , "更新", "UPPER", "WHERE", , , , , ]。 在 org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:9566) 在 org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:9443) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1947) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1791) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_expression(JPQL.java:1753) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1942) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1791) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) 在 org.apache.openjpa.kernel.jpql.JPQL.conditional_expression(JPQL.java:1753) 在 org.apache.openjpa.kernel.jpql.JPQL.where_clause(JPQL.java:1556) 在 org.apache.openjpa.kernel.jpql.JPQL.select_statement(JPQL.java:91) 在 org.apache.openjpa.kernel.jpql.JPQL.parseQuery(JPQL.java:63) 在 org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.parse(JPQLExpressionBuilder.java:1740) 在 org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.(JPQLExpressionBuilder.java:1727) 在 org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:48) 在 org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:152) 在 org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:657) 在 org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:639) 在 org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:605) 在 org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:667) 在 org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1492) 在 org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123) 在 org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:243) 在 org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:294)

【问题讨论】:

【参考方案1】:

"xxx IN yyy" 应该是“someValue IN someCollection”。您在右侧没有集合,因此例外。如果您的查询现在确实在右侧有一个集合(它没有在您的帖子中)并且您仍然得到一个异常,那么发布实际的异常+堆栈跟踪。如果“xxx”和“yyy”应该相等,那么你使用“=”

【讨论】:

以上是关于JPA CONCATE 与 IN 运算符一起使用时抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

将 kafka 与 jpa 一起使用时的良好做法

JPA 查询语言中的 IN 和 = 运算符

将 OneToOne/ManyToOne 与 JPA 和多个数据源一起使用时出错

将 Spring Boot 与 JPA 一起使用时如何持久化

JPA 可以与 EE 5 服务器一起使用吗