java - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 未找到函数“WITHIN”;SQL 语句
问题描述
在这里,我试图找到我提供的范围内的所有实体。我的意思是,如果我给出一个一定半径的圆,它必须显示所有具有位于给定圆内的位置坐标的实体。
我正在使用休眠空间来实现这一点。但是在 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
解决方案
听起来你没有SpatialDialect
为 MySQL 配置。你能验证你是否有线路吗
hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
在hibernate.properties
文件中。
您还可以检查日志以查看 Hibernate 实际使用的方言。它应该在名称中包含“空间”,以便空间功能可用于休眠。
推荐阅读
- wordpress-gutenberg - extraprops 覆盖现有的道具
- r - 如何使用 R 中的循环进行分组和求和?
- node.js - 我的 NodeJs 项目在我的主机中不起作用(CPanel)
- api - 在 ROBOT 框架中使用 JSON Schema 验证 JSON 响应
- selenium - SeleniumBasic 无法创建 Chrome 进程
- html - 对齐输入元素
- version-control - 如何在 Gitea 源控制器中更改存储库检测到的语言
- questdb - 查询以检查正在运行的 QuestDB 实例的配置属性
- vue.js - Vue API 数据在窗口刷新时消失了
- django - 当应用程序关闭时获取有关 React-Native 的通知(如果可能,使用 websockets)