2013-03-06 3 views
1

В моем текущем проекте я использую hibernate JPA как библиотеку персистентности. И я получаю странную ошибку при настройке параметров для запроса.Ошибка типа параметра JPQL

У меня есть следующие:

List<Location> loca = JPA.em().createQuery(
    "SELECT location FROM Location as location" 
    + " where " 
    + "(6371 * acos(cos(PI()/180 * :platitude) * cos(PI()/180 *location.latitude ) * " 
    + "cos(PI()/180 *location.longitude - PI()/180 *:plongitude) + sin(PI()/180 *:platitude) * " 
    + "sin(PI()/180 *location.latitude))) < :radius") 
    .setParameter("radius", 10000.0) 
    .setParameter("platitude", new Double(latitude)) 
    .setParameter("plongitude", new Double(longitude)) 
    .getResultList(); 

Ошибка результат:

[IllegalArgumentException: Значение параметра [43,239474] не соответствие типа [java.lang.Integer]]

Но это значение не может быть отлито для целого из-за потери точности.

Любые предложения?

+0

В чем вы работаете? Является ли тип поля в базе данных десятичным? Является ли атрибутом сущности двойным? – rbento

+0

Я использую postgresql, да атрибут сущности двойной, а поле базы данных - «двойная точность». –

+1

Вы пытались заменить 180 на 180.0? –

ответ

1

Если вы используете Hibernate под JPA, вы можете решить эту проблему, используя сессию Hibernate напрямую. У меня была такая же проблема, и я не мог найти другого пути.

Следующие должны работать:

Session session = (Session) JPA.em().getDelegate(); 
List<Location> loca = session.createQuery(
    "SELECT location FROM Location as location" 
    + " where " 
    + "(6371 * acos(cos(PI()/180 * :platitude) * cos(PI()/180 *location.latitude ) * " 
    + "cos(PI()/180 *location.longitude - PI()/180 *:plongitude) + sin(PI()/180 *:platitude) * " 
    + "sin(PI()/180 *location.latitude))) < :radius") 
    .setParameter("radius", 10000.0, new DoubleType()) 
    .setParameter("platitude", new Double(latitude), new DoubleType()) 
    .setParameter("plongitude", new Double(longitude), new DoubleType()) 
    .list(); 
0

JPA ожидает двойное значение параметра типа для: радиуса. Поэтому просто обновите назначение параметра радиуса как;

.setParameter("radius", new Double(10000.0)) 
+0

Значение, вызывающее проблему, равно 43.239474 – JamesB

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