Сколько «И» может быть в запросе SpringData? - PullRequest
1 голос
/ 06 июня 2019

Я создал этот метод:

    Long getAttributesAfterTimeSent(String x, String y, Long timeSent) { 
        return repository.countByXAndYAndZTypesAndTimeSentGreaterThanEqual(
                   x, 
                   y, 
                   new ArrayList<String>() {{ add("attribute1"); add("attribute2"); }}, 
                   timeSent);
    } 

Сигнатура этого метода в хранилище выглядит следующим образом:

Long countByXAndYAndZTypesAndTimeSentGreaterThanEqual(String x, String y, Collection<String> attributeTypes, timeSent);

Когда я запускаю его, я получаю следующую ошибку:

13:18:40.784 [main] INFO  o.h.h.i.QueryTranslatorFactoryInitiator - HHH000397: Using ASTQueryTranslatorFactory
13:18:41.014 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1797, SQLState: 42000
13:18:41.014 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper - SQL error: 1797 ORA-01797: this operator must be followed by ANY or ALL

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet

Есть указатели?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Разобрался с ответом.

Одним из моих типов был нескалярный тип: ArrayList.

Для подобных случаев нам нужно использовать IN ключевое слово в методе JPA.

Поэтому при изменении метода с

countByXAndYAndZTypesAndTimeSentGreaterThanEqual

на

countByXAndYAndZTypesInAndTimeSentGreaterThanEqual

это работало как шарм.

0 голосов
/ 06 июня 2019

Это почти наверняка не имеет ничего общего с количеством AND фраз в вашем методе.Ограничение подразумевается только через что-то вроде максимальной длины имени метода, максимальной длины запроса, максимального количества параметров.Это будет намного выше, чем то, что любой здравомыслящий человек попытается втиснуть в одно имя метода.

Причина исключения , которое вы видите:

ПРИЧИНА: равный оператор =, за которым следует множественное значение, например (1,2)

Это, вероятно, означает: один из параметров или, возможно, некоторые из атрибутов не скалярного типа, а некоторый наборили массив.

Если это приводит вас к чему-то, что вы не можете легко выразить через имя метода, используйте аннотацию @Query и предоставьте точный запрос, который вам нужно выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...