2015-09-21 1 views
0

Я пытаюсь запустить сложный JPQL QUERY, который не выбрасывает Exception и работает странно.JPA CONCATE при использовании с вызовом оператора IN Исключение

Так вот мой запрос

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:.. Встречающиеся «б рк COL1 NOT IN (выберите рк col1 ИЗ Table3 а где CONCAT (а рк.... tagId, \ 'ayush \') IN ("при знаке 249, но ожидается: [" (",") "," * "," + ",", "," - ",". ","/",": "," < "," < = "," <> "," = ","> ","> "", "?", "ABS", "ALL", "AND", " ЛЮБОЙ »,« AS »,« ASC »,« AVG », « МЕЖДУ »,« ОБО »,« BY »,« CONCAT »,« COUNT »,« CURRENT_DATE »,« CURRENT_TIME »,« CURRENT_TIMESTAMP »,« DELETE »,« DESC »,« DISTINCT »,« EMPTY »,« ESCAPE »,« EXISTS »,« FETCH »,« FROM », « GROUP »,« HAVING »,« IN »,« INNER »,« IS », , «ПРИСОЕДИНЯЙТЕСЬ», «ВЕДУЩИЙ», «ВЛЕВО», «L «НОМЕР», «НРАВИТСЯ», «ЛОКАЛЬНЫЙ», «НИЖНИЙ», «МАКС», «ЧЛЕН», «МИН», «МОД», «НОВЫЙ», «НЕ», «НУЛЛ», «ОБЪЕКТ», «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, запрос работает, однако это был демонстрационный запрос, и я действительно должен использовать Список там

EDIT: Это мой новый 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))) 

И я все еще получаю же исключение

Exception данные: org.apache.openjpa.persistence .ArgumentException: Encounted "b. pk. col1 NOT IN (выберите a. pk. col1 FROM Table3 a где CONCAT (a .pk. tagId, \ 'ayush \') IN "в символе 249, но ожидается: [" (",") "," * "," "+", ",", "-", ".", "/", ":", "<", "< =", "<>", "=", ">", "> =" , «АБС», «АБС», «ВСЕ», «И», «ЛЮБЫЕ», «КАК», «АСК», «АВГ», «МЕЖДУ», «ОБО», «В», «КОНКАТ», COUNT "," CURRENT_DATE "," CURRENT_TIME "," CURRENT_TIMESTAMP "," DELETE "," DESC "," DISTINCT "," EMPTY "," ESCAPE "," EXISTS "," FETCH "," FROM "," GROUP " «ВХОД», «В», «ВНУТРЕННИЙ», «ИС», «ПРИСОЕДИНЯЙТЕСЬ», «ВЕДУЩИЙ», «ВЛЕВО», «ДЛИНА», «НРАВИТСЯ», «ЛОКАЛЬНЫЙ», «НИЖНИЙ», «МАКС», 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.kerne l.jpql.JPQL.jj_consume_token (JPQL.java:9443) at org.apache.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) по адресу org.apache.openjpa.kernel.jpql.JPQL.conditional_term (JPQL.java:1804) at org.apache.openjpa.kernel.jpql.JPQL.conditional_expression (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) на $ org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder ParsedJPQL. (JPQLExpressionBuilder.java:1727) в 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 (QueryI mpl.java:657) на org.apache.openjpa.kernel.QueryImpl.compilationFromCache (QueryImpl.java:639) на org.apache.openjpa.kernel.QueryImpl.compileForCompilation (QueryImpl.java:605) в орг. 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)

ответ

0

"xxx IN yyy" s hould be "{someValue} IN {someCollection}". С правой стороны у вас нет коллекции, поэтому исключение. Если ваш запрос действительно имеет теперь коллекцию с правой стороны (чего нет в вашем сообщении), и вы по-прежнему получаете исключение, то публикуете фактическую исключение + трассировку стека. Если предполагается, что «xxx» и «yyy» равны, вы используете «=»