Get Query не работает при использовании HQL в Hibernate Spatial - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Spring boot вместе с Hibernate для пространственного запроса. Используемые библиотеки: 1. Spring boot - 2.1.3.RELEASE 2. Hibernate Spatial - 5.3.7.Final 3. MariaDB - mysql Ver 15.1 Distrib 10.1.36-MariaDB

Всякий раз, когда я использую HQL, как показано ниже вЗапрос, я получаю следующую ошибку во время запуска приложения, однако, когда я пытаюсь использовать собственный запрос, он работает.

Я пробовал с разными диалектами. Также попытался использовать columnDefinition со значением в качестве геометрии, geolatte-geometry.

pom.xml

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-spatial</artifactId>
      <exclusions>
        <exclusion>
          <groupId>org.postgresql</groupId>
          <artifactId>postgresql</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        jdbc:
          lob:
            non_contextual_creation: true
        physical_naming_strategy: com.orange.alc.polygon.dao.config.DefaultNamingStrategy 
        format_sql: false
        dialect: org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect 

@Entity
public class PolygonMasterEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  // Here we have used Geolatte library
  private Polygon geometry;

  @Column(name = "is_active")
  private Boolean active;

  @Column(name = "is_deleted")
  private Boolean deleted;
}

@Repository
public interface PolygonMasterRepository extends JpaRepository<PolygonMasterEntity, Long>,
    JpaSpecificationExecutor<PolygonMasterEntity> {

  @Query("select master from #{#entityName} master WHERE" 
      + " and within(master.geometry, :point)")
  List<PolygonMasterEntity> findCostUsingPointForLLME(
      @Param("point") Point point);

}

В настоящее время я получаюследующая ошибка во время запуска:

Причина: org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный узел AST: (около строки 1, столбец 164 [выберите мастер из com.orange.alc.polygon.dao.entity.PolygonMasterEntity master ГДЕ внутри (master.geometry,: point)]

~~~~~~~~~   at org.hibernate.hql.internal.ast.ErrorTracker.throwQueryException(ErrorTracker.java:93)
~~~~~~~~~   at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:277)
~~~~~~~~~   at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:191)
~~~~~~~~~   at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143)
~~~~~~~~~   at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119)
~~~~~~~~~   at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
~~~~~~~~~   at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
~~~~~~~~~   at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:595)
~~~~~~~~~   at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:704)
~~~~~~~~~   ... 100 common frames omitted


Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Свойства в spring.jpa.properties используются как есть и напрямую передаются в JPA как Map. Поскольку Spring (Boot) не анализирует их, вы не можете использовать обычный синтаксис YAML, но должны включать имена свойств, как в .. Это также объясняется в этом выпуске Github и Spring Boot Documentation .

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate.jdbc.lob.non_contextual_creation: true
      hibernate.physical_naming_strategy: com.orange.alc.polygon.dao.config.DefaultNamingStrategy 
      hibernate.format_sql: false
      hibernate.dialect: org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect 

Должно работать и устанавливать правильный диалект.

0 голосов
/ 04 ноября 2019

У вас есть and сразу за WHERE в вашем запросе. Я не думаю, что это законный HQL, и вы должны отказаться от and.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...