简体   繁体   English

与IN运算符一起使用时,JPA CONCATE引发异常

[英]JPA CONCATE when used with IN operator throws Exception

I am trying to run a complex JPQL QUERY which doesn't throws Exception and works weirdly. 我正在尝试运行一个复杂的JPQL QUERY,它不会引发Exception并且工作异常。

So here is my 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'))

For Some Reason it throws error on Last line. 由于某种原因,它在最后一行上引发错误。 Here is the error 这是错误

Exception data: org.apache.openjpa.persistence.ArgumentException: Encountered "b . pk . col1 NOT IN ( select a . pk . col1 FROM Table3 a where CONCAT ( a . pk . tagId , \\'ayush\\' ) IN (" at character 249, but expected: ["(", ")", "*", "+", ",", "-", ".", "/", ":", "<", "<=", "<>", "=", ">", ">=", "?", "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", "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", , , , , ]. 异常数据:org.apache.openjpa.persistence.ArgumentException:遇到“ b.pk.col1 NOT IN(从表3a中选择一个.pk.col1,其中CONCAT(.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”,“ LENGTH”,“ LIKE”,“ LOCATE”,“ LOWER”,“ MAX”,“ MEMBER”,“ MIN”,“ MOD”,“ NEW”,“ NOT”,“ NULL”,“ OBJECT”,“ OF” ,“或”,“订单”,“外部”,“选择”,“设置”,“尺寸”,“一些”,“ SQRT”,“ SUBSTRING”,“ SUM”,“ TRAILING”,“ TRIM”,“ UPDATE”,“ UPPER”,“ WHERE” 、、、、、、]。

I have broken the query into multiple lines for the clarity : 为了清楚起见,我将查询分为多行:

This is the query in one single line 这是一行中的查询

    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'))

I forgot to mention that if I try to use = instead of IN , the query works, however this was a demo query and I actually have to use a List there 我忘了提一下,如果我尝试使用=而不是IN ,则查询有效,但是这是一个演示查询,实际上我必须在其中使用列表

EDIT : This my new JPA QUERY to which I give a Collection rather than some hard coded value 编辑 :这是我给我的新的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)))

And I still get the same Exception 而且我仍然得到同样的异常

Exception data: org.apache.openjpa.persistence.ArgumentException: Encountered "b . pk . col1 NOT IN ( select a . pk . col1 FROM Table3 a where CONCAT ( a . pk . tagId , \\'ayush\\' ) IN" at character 249, but expected: ["(", ")", "*", "+", ",", "-", ".", "/", ":", "<", "<=", "<>", "=", ">", ">=", "?", "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", "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", , , , , ]. at org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:9566) at org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:9443) at org.apac 异常数据:org.apache.openjpa.persistence.ArgumentException:遇到“ b.pk.col1 NOT IN(从表3a中选择一个.pk.col1,其中CONCAT(.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”,“ LENGTH” “,”喜欢“,”定位“,”降低“,”最大“,”成员“,”最小“,” MOD“,”新“,”不“,”空“,”对象“,” OF“, “或”,“订单”,“外部”,“选择”,“设置”,“尺寸”,“一些”,“ SQRT”,“ SUBSTRING”,“总和”,“跟踪”,“修剪”,“更新” org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:9566)上的”,“ UPPER”,“ WHERE” 、、、、、]。org.apache.openjpa.kernel.jpql.JPQL。 org.apac上的jj_consume_token(JPQL.java:9443) he.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1947) at org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1791) at org.apache.openjpa.kernel.jpql.JPQL.conditional_expression(JPQL.java:1753) at org.apache.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1942) at org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1791) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_expressi org.apache.openjpa.kernel.jpql.JPQL.conditional_factor(JPQL.java:1925)上的he.openjpa.kernel.jpql.JPQL.conditional_primary(JPQL.java:1947)org.apache.openjpa.kernel.jpql。 org.apache.openjpa.kernel.jpql.JPQL.conditional_expression(JPQL.java:1753)上的JPQL.conditional_term(JPQL.java:1791),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 org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804)的org.apache.openjpa.kernel.jpql.JPQL.conditional_term的.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) (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_expressi上的org.apache.openjpa.kernel.jpql.JPQL.conditional_term(JPQL.java:1804) on(JPQL.java:1753) at org.apache.openjpa.kernel.jpql.JPQL.where_clause(JPQL.java:1556) at org.apache.openjpa.kernel.jpql.JPQL.select_statement(JPQL.java:91) at org.apache.openjpa.kernel.jpql.JPQL.parseQuery(JPQL.java:63) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.parse(JPQLExpressionBuilder.java:1740) at org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder$ParsedJPQL.(JPQLExpressionBuilder.java:1727) at org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:48) at org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:152) at org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:657) at org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:639) at org.apache.openjpa.kernel.QueryImpl.compileForCompilation(QueryImpl.java:605) at org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:667) at org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1492) at org.apache.openj org.apache.openjpa.kernel.jpql.JPQL.where_clause(JPQL.java:1556)上的(JPQL.java:1753)org.apache.openjpa.kernel.jpql.JPQL.select_statement(JPQL.java:91)上的(JPQL.java:1753)在org.apache.openjpa.kernel.jpql.JPQL.parseQuery(JPQL.java:63)在org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder $ ParsedJPQL.parse(JPQLExpressionBuilder.java:1740)在org.apache.openjpa org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:48)上的.kernel.jpql.JPQLExpressionBuilder $ ParsedJPQL。(JPQLExpressionBuilder.java:1727)在org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation org.apache.openjpa.kernel.QueryImpl.newCompilation(QueryImpl.java:657)处的ExpressionStoreQuery.java:152)org.apache.openjpa处的org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java:639)处的ExpressionStoreQuery.java:152) org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:667)上的.kernel.QueryImpl.compileForCompilation(QueryImpl.java:605)org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1492) )在org.apache.openj pa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123) at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:243) at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:294) org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:243)的pa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123)在org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java: 294)

"xxx IN yyy" should be " {someValue} IN {someCollection} ". "xxx IN yyy"应为“ {someValue} IN {someCollection} ”。 You don't have a collection on the right hand side, hence the exception. 您的右侧没有集合,因此是个例外。 If your query really does now have a collection on the right hand side (which it doesn't in your post) and you still get an exception then post the actual exception+stack trace. 如果您的查询现在确实确实在右侧有一个集合(它不在您的帖子中),并且您仍然收到异常,请发布实际的异常+堆栈跟踪。 If the "xxx" and "yyy" are supposed to be equal, then you use "=" 如果假定“ xxx”和“ yyy”相等,则使用“ =“

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么String使用+运算符连接null并使用concate()方法抛出NullPointerException - Why String concatenate null with + operator and throws NullPointerException with concate() method JPA查询引发异常 - JPA query throws the exception Java Spring Boot JPA - 保存到数据库时引发 NullPointer 异常 - Java Spring Boot JPA - Throws NullPointer Exception when saving to database 当rowKey属性是主键时,为什么JPA实体抛出异常? - Why JPA entity throws exception when rowKey attribute is the primary key? Java URLDecoder与包含%的字符串一起使用时抛出异常 - Java URLDecoder throws exception when used with a string containing a % 当我尝试使用JPA进行本地数据存储时,Eclipse RCP引发异常 - Eclipse RCP throws exception when I try to use JPA for local data storage 什么时候抛出“ throws Exception”? - When is “throws Exception” thrown? OrientDB ETL导入:“跳过”运算符引发异常 - OrientDB ETL import: 'skip' operator throws exception Spring数据JPA:数据类型varchar和varbinary在add运算符中不兼容使用concat()方法时出现异常 - Spring Data JPA: The data types varchar and varbinary are incompatible in the add operator exception occurs when using concat() method 使用Google Places API,Location类在使用时引发Null Pointer Exception - Using Google Places API, Location class throws Null Pointer Exception when used
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM