【发布时间】:2020-02-29 11:09:19
【问题描述】:
我正在使用 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.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
【问题讨论】:
-
您不能使用
:来分隔spring.jpa.properties的属性,它们必须使用.。这些属性按原样使用,因此不支持:。所以请改用hibernate.dialect等等。这适用于spring.jpa.properties命名空间下的所有属性。见github.com/spring-projects/spring-boot/issues/17975 -
另外,我已经对其进行了进一步调试,异常发生在包 org.hibernate.hql.internal.antlr 下的 HqlSqlBaseWalker 类中。它没有任何空间方法的标记。在行 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2146)
-
因为映射了错误的方言,这是由于使用了错误的属性。
标签: spring hibernate spring-data-jpa mariadb hibernate-spatial