【问题标题】:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Function "WITHIN" not found; SQL statementorg.hibernate.engine.jdbc.spi.SqlExceptionHelper - 未找到函数“WITHIN”; SQL 语句
【发布时间】:2019-08-09 20:49:27
【问题描述】:

在这里,我试图找到我提供的范围内的所有实体。我的意思是,如果我给出一个特定半径的圆,它必须显示所有具有位于给定圆内的位置坐标的实体。

我正在使用 hibernate-spatial 来实现这一点。但在 JPA Repository 界面中出现上述错误。

这里是pom.xml

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-spatial</artifactId>
    <version>5.2.12.Final</version>
</dependency>
<dependency>
    <groupId>org.opengeo</groupId>
    <artifactId>geodb</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

Jpa 存储库,

public interface ResourceRepository extends ExtendedJpaRepository<Resource, String> {   
    @Query(value = "select resource from Resource resource where within(resource.address.location, :circle) = true")
    List<Resource> test(@Param("circle") Geometry circle);
}

Resource.java,

@Entity
@NoArgsConstructor
public class Resource extends UUIDEntity2 implements IsResource {

    @Type(type = "org.hibernate.spatial.GeometryType")
    @OneToOne
    private Address address;

    /*getters setters*/
}

Address.java,

@Entity
public class Address extends UUIDEntity2 implements HasEmailAddress, HasLocation {

    @Embedded
    @Column(columnDefinition = "point")
    private Location location;
    /*getters setters*/
}

location.java,

@Embeddable
@Value(staticConstructor = "of")
@RequiredArgsConstructor(staticName = "of")
public class Location implements Serializable {

    @Column(nullable = true)
    private Double lat;

    @Column(nullable = true)
    private Double lon;
}

测试,

    @Inject
    private ResourceRepository resourceRepository;

    public Geometry createCircle(double x, double y, double radius) {
        GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
        shapeFactory.setNumPoints(32);
        shapeFactory.setCentre(new Coordinate(x, y));
        shapeFactory.setSize(radius * 2);
        return shapeFactory.createCircle();
    }

    @Test
    public void geometry(){
        Geometry m = createCircle(0.0, 0.0, 5);
        List<Resource> resources = resourceRepository.test(m);
    }

application.properties,

hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect

注意:此处未显示实体的所有属性。 参考我关注:Hibernate-Spatial

【问题讨论】:

    标签: java spring-boot jpa hibernate-spatial


    【解决方案1】:

    听起来您没有为 MySQL 配置 SpatialDialect。你能验证你是否有这条线

    hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
    

    hibernate.properties 文件中。

    您还可以查看日志以查看 Hibernate 实际使用的方言。名称中应包含“Spatial”,以便 Spatial 函数可用于休眠。

    【讨论】:

    • 我在 application.properties 文件中添加了它。但是日志说它正在使用 'org.hibernate.dialect.H2Dialect' 。那怎么配置呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多