2015-06-09 2 views
2

В моей SQL-сервер, поле даты сохраняются в формате с плавающей точкой (ES: DATADOC = 42155)Cast поле в JPA Query

Я хочу, чтобы импортировать поле в БД MySQL как DATETIME. Я стараюсь на SQL-сервере, чтобы бросить на поле с этим запросом:

SELECT CAST(DATDOC as DATETIME) -2 FROM FATTURE where id=25460; 

И результат является правильным.

Теперь я хочу, чтобы перевести его в JPA Query:

TypedQuery<DateTime> convFattura = emI24.createQuery(" SELECT CAST(dataFattura as DATETIME) -2 FROM FatturaI24 f where f.id = :idFattura", DateTime.class); 

Но я получил эту ошибку:

09-06-2015 14:32:00 ERROR: org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task. 
java.lang.NullPointerException 
    at org.hibernate.dialect.function.CastFunction.render(CastFunction.java:55) 
    at org.hibernate.hql.internal.ast.SqlGenerator.endFunctionTemplate(SqlGenerator.java:220) 
    at org.hibernate.hql.internal.antlr.SqlGeneratorBase.methodCall(SqlGeneratorBase.java:2326) 
    at org.hibernate.hql.internal.antlr.SqlGeneratorBase.simpleExpr(SqlGeneratorBase.java:2681) 
    at org.hibernate.hql.internal.antlr.SqlGeneratorBase.expr(SqlGeneratorBase.java:1476) 

Что такое правильный синтаксис CAST в DATETIME?

Любые идеи?

+0

Что такое '' -2''? Вы пытаетесь вычесть 2 дня? месяцы? или ???? –

+0

@RavinderReddy Days, таким образом я получил правильный traslate (я это проверил) – PaolaG

+0

CAST недействителен JPQL. Вы можете использовать функцию SQL «CAST», используя стандарт JPQL «FUNCTION» (в JPA 2.1) –

ответ

0

Как говорится в комментариях, возвращаемое значение типа с плавающей точкой, так что мы будем делать, не делаем бросок в SQL, но конвертировать поплавок с Java кодом и у вас есть ниже правильный код:

Query convFattura = emI24.createQuery(" SELECT f.dataFattura FROM FatturaI24 f where f.id = :idFattura"); 
      convFattura = convFattura.setParameter("idFattura", idFatturaValue); 
     float dataFattura = convFattura.getSingleResult(); 

Java код для преобразования с плавающей точкой на сегодняшний день:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
calendar.set(Calendar.HOUR_OF_DAY, 0); 
calendar.add(Calendar.HOUR_OF_DAY, (int) dataFattura); 
calendar.set(Calendar.MINUTE, (int) ((dataFattura * 60) % 60)); 
calendar.set(Calendar.SECOND, (int) ((dataFattura * 3600) % 3600)); 

DateFormat fmt = new SimpleDateFormat(); 
fmt.setTimeZone(TimeZone.getTimeZone("Europe/Paris")); 
System.out.println(fmt.format(calendar.getTime())); 

Надеется, что это полезно для вас!

+0

Извините, но моя проблема не в этом. Я хочу преобразовать значение float в DATETIME. Запрос на извлечение всего значения выполняется, но значение dataFattura равно (p.e: 42155), и это значение для меня не подлежит. – PaolaG

+0

Я изменил свой ответ, можете ли вы проверить его и позвонить мне, если это решит проблему? – TinyOS

+0

Я использовал этот способ, но не запускаюсь. Результат неверен (es: dataFloat = 42171, DateFormat = 07/04/20 5,00) В моем первом запросе resultSet начинается с 2012 года. Это mistery :) – PaolaG

1

попробуйте использовать функцию преобразования вместо функции Cast. это работает для меня ...!

+0

Вы могли бы улучшить свой ответ, добавив ссылки и объяснив различия между этими двумя методами и почему один работал, а не другой. – mathielo