2013-03-18 2 views
2

У меня возникла странная проблема. Я ищу, в том числе здесь, в переполнении стека, а для JPA и Custom query я должен указать параметр. Таким образом, у меня есть строка запроса, так как у меня более 14 полей, но у меня проблемы с датами. Я всегда получаю IllegalStateExceptionJPA, пользовательский запрос и даты

INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC 
WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument startDate not found in the list of parameters provided during query execution. 

, как для моего запроса:

Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE); 

Хотя я получаю, что параметр не найден, он у меня в setParameter, а также установить в запросе как видно в строке INFO.

Любые идеи?

Заранее спасибо

EDIT:

INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC 
WARNING: #{ticketController.search}: java.lang.IllegalStateException: Query argument 1 not found in the list of parameters provided during query execution. 

q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.TIMESTAMP); 

Также и в соответствии с рекомендациями, я проверил, что дата я использую java.util.Date. и в классе сущности у меня есть отметка времени. Но все-таки я не могу работать и не уверен, где я потерплю неудачу.

Просто чтобы убедиться, что все вещи, как они должны, я вынужден запрос быть строкой, и я получил правильное исключение:

INFO: query STRING = SELECT t FROM Tickets t WHERE t.startdate > :startDate AND t.enddate < :endDate ORDER BY t.status DESC 
WARNING: #{ticketController.search}: java.lang.IllegalArgumentException: You have attempted to set a value of type class java.lang.String for parameter startDate with expected type of class java.util.Date 

Но опять же, я меняю на сегодняшний день, и это не может: S Я проверил причины этого IllegalStateException:

и от отладки и от javadoc я получаю следующее: getResultList

IllegalStateException - если вызывается для языка запросов Java Persistence UPDATE или DELETE.

Я не делаю обновление не стираю:/

EDIT 2: Добавление Entity соответствующей части:

@Basic(optional = false) 
@NotNull 
@Column(name = "startdate") 
@Temporal(TemporalType.TIMESTAMP) 
private Date startdate; 
@Column(name = "enddate") 
@Temporal(TemporalType.TIMESTAMP) 
private Date enddate; 

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

startdate timestamp with time zone NOT NULL, 
    endate timestamp with time zone, 

Если я нормальный SQL запрос типа: «выберите * из tbl_tickets где StartDate> '2012-02-01 00:00:00' и ENDDATE < '2013-03-18 23:59:50' '

Я получаю желаемые результаты. Наверное, я мог бы сделать с собственным запросом, но это обошло бы проблему и не исправляло бы эту проблему, не так ли?

EDIT 3: Хотя я все настроено правильно, то инициализация бин снова вызвав запрос без аргументов (. Извини и спасибо всем за вашу помощь Это помогло мне проверить, что было неладно)

+0

'endate' is in SQL - это опечатка, правильно? Должен быть «enddate»? –

ответ

4

Javadoc для обоих

setParameter(String name, java.util.Date value, TemporalType temporalType)` 
setParameter(String name, java.util.Calendar value, TemporalType temporalType)` 

состояний:

Th строки: IllegalArgumentException - если имя параметра не соответствует параметру запроса или если значение аргумента неправильного типа

Поскольку вы не предоставили полный код, убедитесь, что:

  • Значение Java startDate имеет тип java.util.Date или java.util.Calendar.

  • SQL-столбец startDate имеет действительный тип даты SQL TIMESTAMP.

+0

спасибо, я обновил вопрос, после проверки не проблемы. Следует также отметить, что когда запись создается в базе данных, startdate автоматически устанавливается приложением с объектом типа date. и он корректно сохраняет без ошибок. –

+0

Вы действительно оставляете всех догадываться. Пожалуйста, покажите: a) SQL, используемый для создания таблицы, и b) соответствующие части Java-сущности. –

+1

В вашем коде все еще отсутствует часть - переменные и код, которые настраивают запрос. Как объявляются эти переменные? Они должны быть java Date или Calendar, не так ли? –

1

Я думаю, что должно быть пробел между : (двоеточие) и startDate между ними. Может быть, он рассматривает : startDate как одно слово.Попробуйте этот раз

0
Query q = em.createQuery(query).setParameter("startDate", startDate, TemporalType.TIMESTAMP).setParameter("endDate", endDate, TemporalType.DATE); 

Если вы внимательно посмотрите на setParameter вы используете, он говорит, что это setParameter требует Positional Parameter, в то время как, видя ваш запрос, он, кажется, вы использовали Named Parameter.

Следовательно, IllegalStateException. Либо измените свой запрос, чтобы предоставить Positional Parameters, либо setParameter для ввода Named Parameters в качестве входных данных.

В этом вопросе вы предоставляете Positional Parameter.

String query = "SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC"; 
.... 
Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE); 
+0

Спасибо за информацию. Я пробовал, как вы упомянули, но все еще та же проблема. И я получаю это только при вызове q.getResultList. до тех пор переменные должным образом заполняются, хотя в режиме отладки я вижу, что запрос jpql является маркером как «startdate>?» И большое спасибо за объяснение, я бы пропустил его в течение долгого времени с именем vs positional. –

+0

теперь говорит 'IllegalArgumentException', что означает, что локальная переменная' startDate' не является типом 'Date'. Кажется, это единственный вероятный случай. – SudoRahul

+0

, который должен был показать, что линия фактически выполняется. Я сделал это для тестирования, когда форсирование типа было строкой. Я все еще получаю исключение штата. –

1

Попробуйте

String query = "SELECT t FROM Tickets t WHERE t.startdate > ?1 AND t.enddate < ?2 ORDER BY t.status DESC"; 

Query q = em.createQuery(query).setParameter(1, startDate, TemporalType.TIMESTAMP).setParameter(2, endDate, TemporalType.DATE);

Смежные вопросы