2016-10-02 5 views
1

Я пытаюсь выполнить этот запрос в моей Java кода, используя Hibernate и гибернации Spatial:Hibernate пространственное исключение запроса, но в Postgres консоль работает

Query q = s.createQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.30621000000001 -25.515020000000003)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true;"); 

Но этот запрос вызывает исключение:

e = (org.hibernate.hql.internal.ast.QuerySyntaxException) org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE_BRACKET, found ',' near line 1, column 151 [SELECT c FROM com.safecity.server.db.model.EntityCrime c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.305820000000004 -25.515330000000002)','SRID=4326;POINT(-49.306200000000004 -25.515340000000002)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true] 

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

Пожалуйста, кто-нибудь может мне помочь? Спасибо.

+0

Подходя к этому, упростите запрос. 'ST_DWITHIN()' уже возвращает 'boolean'. Нет необходимости добавлять '= true', это просто шум:' SELECT c FROM crime c WHERE ST_DWITHIN (ST_MakeLine (ARRAY [...]), c.location, 0.0001) ' –

+0

Спасибо, я изменю это – brunoroberto

ответ

1

Вы используете собственный запрос здесь, в спящем режиме. Для этого нужно использовать запрос, как показано ниже:

Query q = s.createSQLQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_MakeLine(ARRAY['SRID=4326;POINT(-49.30621000000001 -25.515020000000003)','SRID=4326;POINT(-49.30619 -25.515770000000003)','SRID=4326;POINT(-49.306180000000005 -25.5162)','SRID=4326;POINT(-49.305780000000006 -25.5162)']), c.location, 0.0001) = true;"); 

Использование createSQLQuery() вместо CreateQuery(), если вы хотите создать дб родной запрос вместо HQL.

+0

Я попробовал ваше предложение, но теперь происходит другое исключение: e = (org.hibernate.MappingException) org.hibernate.MappingException: Нет Диалектическое сопоставление для типа JDBC: 1111. Знаете ли вы, почему? – brunoroberto

+0

Свойство исключения сопоставления типов, в котором тип столбца не может быть сопоставлен с типом базы данных с помощью спящего режима. Если вы не можете правильно сопоставить вещи, добавьте весь код (класс pojo, структуру таблицы и основной класс, где вы запускаете свой запрос.) –

+0

Странно, потому что я использую другой запрос с той же таблицей и объектом и он не вызывает никаких исключений. Но, я использовал в этом другом запросе только createQuery, а не createSQLQuery. – brunoroberto

0

Я решил эту проблему, изменив запрос, для этого:

Query q = s.createQuery("SELECT c FROM crimes c WHERE ST_DWITHIN(ST_GeomFromText('LINESTRING(-49.305820000000004 -25.515330000000002,-49.306200000000004 -25.515340000000002,-49.30619 -25.515770000000003,-49.306180000000005 -25.5162,-49.305780000000006 -25.5162)', 4326), c.location, 0.0001) = true"); 

Я не знаю, почему, но это работает.

Спасибо за помощь.

0

Я видел аналогичные проблемы с ARRAY constructors в Hibernate раньше.

Заменить с массивом буквальным (и, необязательно, тип литой), чтобы заставить его работать. Простой string literal избежит различных осложнений в сообщении.

Вы используете PostGis function ST_MakeLine(), используя массив geometry в качестве входного параметра.

геометрия ST_MakeLine (geometry[] geoms_array)

Итак:

Query q = s.createQuery(
    "SELECT c FROM crimes c 
    WHERE ST_DWITHIN(ST_MakeLine('{SRID=4326;POINT(-49.30621000000001 -25.515020000000003) 
            ,SRID=4326;POINT(-49.30619 -25.515770000000003) 
            ,SRID=4326;POINT(-49.306180000000005 -25.5162) 
            ,SRID=4326;POINT(-49.305780000000006 -25.5162)}'::geometry[]), c.location, 0.0001)"); 

Это также объясняет, почему your alternative answer обеспечение LineString работ, а также (в качестве строкового литерала!).

Также упрощено булево выражение в пункте WHERElike I commented. Добавление = true - это просто шум.

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

  • Нет связанных вопросов^_^