2014-12-17 8 views
0

Я создал простой @NamedQuery:Java EE именованный запрос с SUM() не работает

@NamedQuery(name = "Etap.findSum", query = "SELECT e.czas FROM Etap e WHERE e.stan=1")

, который работает отлично. Поле e.czas было отображено как Integer и имеет тип INTEGER в базе данных DB2. Теперь, когда я пытаюсь изменить его таким образом:

@NamedQuery(name = "Etap.findSum", query = "SELECT SUM(e.czas) FROM Etap e WHERE e.stan=1")

это не удается, и более того, редактор не дает намек на выбор поданную e.czas в качестве параметра запроса. Когда я меняю тип поданного czas на int, подсказка указывается, но запрос все еще не работает (он работает при вызове из консоли IBM Data Studio).

метод, где я называю запрос приведена ниже (я всегда получаю -1 как результат):

public Integer suma(){ 
     try{ 
      Query q = em.createNamedQuery("Etap.findSum"); 
      Integer suma = (Integer)q.getSingleResult(); 
      return suma; 
     } 
     catch(Exception e) 
     { 
      return -1; 
     } 

Что я делаю неправильно в этом случае?

+1

«Я всегда получаю -1 в результате» означает, что есть исключение. Сделайте себе одолжение и распечатайте трассировку стека. – mustaccio

+1

Вероятно, автоматическое расширение до 'Long', чтобы сумма ваших целых чисел была слишком большой для типа. Учитывая, что в документации для 'SUM (...)' явно указано это поведение, происходящее на стороне db, ORM, вероятно, должен последовать этому примеру. Если вы действительно уверены, что ваш результат может содержаться в int, наберите его после того, как будет рассчитана сумма. –

+0

@mustaccio, вы правы, я искал трассировку стека без попытки, но, видимо, я пропустил что-то – MissAK

ответ

0

Возможно, это связано с тем, что ORM автоматически расширяет результат в ожидании результата, превращающегося в Long, а не Integer. Обратите внимание, что если столбец источника равен Short (эквивалент), то SUM(...) widens the result to an Integer in all cases. В документации явно не указано, что происходит в случае исходного столбца Integer, но я бы предположил, что db автоматически расширяет его в случае, если результат достаточно велик.
ORM тогда должен учитывать это потенциальное поведение, убедившись, что он может обрабатывать длинный - поэтому он передает его этому типу, если только конкретный результат не будет определен как безопасный (путем отбрасывания его до Integer на db).

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