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 语句?
将 OneToOne/ManyToOne 与 JPA 和多个数据源一起使用时出错