将Hibernate-spatial升级到V5.0.0.CR2后,以下声明不再起作用:
@Column(columnDefinition = "geometry(Point,4326)")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point position;
Run Code Online (Sandbox Code Playgroud)
与:
org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.spatial.GeometryType]
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,Jar-File中不再存在该类.GeometryType发生了什么,它是如何被替换的?或者是否包含另一个jar文件?
编辑:澄清.我正在将Hibernate-Spatial与PostgreSQL-Postgis数据库结合使用.
我是Hibernate Spatial的新手,我正在尝试对给定半径内的对象执行简单查询.我使用Google地图和其他来源的数据在我的数据库中创建了许多条目,其中的属性与纬度和经度相对应.这个属性在我的Entity类中定义如下:
@Column
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;
Run Code Online (Sandbox Code Playgroud)
我现在正试图弄清楚如何搜索坐标落在距给定点x公里半径范围内的所有实体对象.例如,我想找到落在该点半径50公里范围内的物体(12.34567,-76.54321).但是,我找不到任何可以解释如何在Hibernate Spatial中执行此操作的示例或教程.
任何人都可以给我任何关于如何构建这样的查询的信息吗?
我正在使用spring boot命令行运行器应用程序,它挂在PostGIS方言中,下面的堆栈跟踪包含正在发生的事情.我无法理解出现了什么问题,我有hibernate-spatial查询.
2018-04-06 12:11:08.554 INFO 31495 --- [ main] replayer.Main : No active profile set, falling back to default profiles: default
2018-04-06 12:11:08.780 INFO 31495 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@39d9314d: startup date [Fri Apr 06 12:11:08 NZST 2018]; root of context hierarchy
2018-04-06 12:11:10.811 INFO 31495 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2018-04-06 12:11:11.149 INFO 31495 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$a0866479] is not eligible for getting …Run Code Online (Sandbox Code Playgroud) 我们使用 H2 进行集成测试已经有一段时间了。现在 H2 2.0.202 已经发布,我们正在尝试将代码库升级到它。我们无法持久保存使用 java.util.UUID 作为类型的实体。考虑下面的例子
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
}
Run Code Online (Sandbox Code Playgroud)
如果我们尝试使用 Hibernate 将其保存在 H2 数据库中,则会失败并显示JdbcSQLDataException消息Value too long for column。测试很简单
@DataJpaTest
class H2Test {
@Autowired MyRepository myRepository;
@Test
void testSave() {
myRepository.save(new MyEntity());
Assertions.assertThat(myRepository.findAll()).hasSize(1);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在PasteBin上找到完整的堆栈跟踪。
我们正在使用 org.hibernate.spatial.dialect.h2geodb.GeoDBDialect,这似乎是此问题的原因之一。如果我们删除它,上面的简单测试用例就可以正常工作,不幸的是我们正在使用空间数据,所以我们需要这种方言。我想知道这是否只是 H2 2.0.202 和 Hibernate 之间缺少兼容性?或者我们可以在配置中做些什么?我在 hibernate jira 中找不到与此问题匹配的问题,而且不知何故我也无法创建一个问题。
我正在使用postgresql,hibernate-spatial和postgis,并期望能够使用SqlQuery来检索Geometry对象.
但是,每当我尝试查询点,多边形或几何时,例如
List list = session.createSQLQuery(
"select geomfromewkt('SRID=1;POINT(1 1)')").list();
Run Code Online (Sandbox Code Playgroud)
我得到了例外:
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
at org.hibernate.dialect.TypeNames.get(TypeNames.java:78)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:103)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:328)
at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:590)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:516)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:532)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1962)
at org.hibernate.loader.Loader.doQuery(Loader.java:802)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
Run Code Online (Sandbox Code Playgroud)
hibernate.cfg.xml中:
<property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property>
Run Code Online (Sandbox Code Playgroud)
这不是hibernate-spatial产品的一部分,还是我做错了什么?
谢谢,保罗.
相关库/版本:
鉴于这里的查询示例:http://www.hibernatespatial.org/tutorial-hs4.html
Query query = em.createQuery("select e from Event e where within(e.location, :filter) = true", Event.class);
query.setParameter("filter", filter);
Run Code Online (Sandbox Code Playgroud)
是否可以使用jpa 2标准api重写查询?(我不确定我应该如何处理该within(e.location, :filter)部分.
我正试图在PostgreSQL 9.3上的Hibernate Spatial 4.0中运行一个简单的查询.我在表中有许多具有纬度/经度值的对象,我正在尝试查询属于特定纬度/经度的给定半径范围内的对象.几何值似乎没有任何问题持久化,并在我的实体类中定义如下:
@Column(columnDefinition = "Geometry", nullable = true)
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;
Run Code Online (Sandbox Code Playgroud)
持久保存具有coordinates值集的对象时,我没有任何错误.但是,当我运行查询时,我看到以下异常:
javax.servlet.ServletException: javax.servlet.ServletException: javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: could not extract ResultSet
<snip />
org.postgresql.util.PSQLException: ERROR: Invalid endian flag value encountered.
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886)
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302)
org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
org.hibernate.loader.Loader.getResultSet(Loader.java:2031)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
org.hibernate.loader.Loader.doQuery(Loader.java:899)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
org.hibernate.loader.Loader.doList(Loader.java:2516)
org.hibernate.loader.Loader.doList(Loader.java:2502)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
org.hibernate.loader.Loader.list(Loader.java:2327)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264)
Run Code Online (Sandbox Code Playgroud)
我正在运行的查询如下所示:
Query query = this.entityManager
.createQuery(
"SELECT v FROM MyEntity v WHERE within(v.coordinates, :filter) = true",
MyEntity.class);
query.setParameter("filter", point); …Run Code Online (Sandbox Code Playgroud) 我想在谓词/规范中重写以下查询,以便我可以链接它们。
此查询过滤特定区域内我定义的所有 OptEvent 实体
@Query(value = "SELECT * FROM opt_event WHERE ST_DWithin(cast(opt_event.locationpoint as geography),ST_SetSRID(ST_Point(?2, ?1),4326), 100000);", nativeQuery = true)
public Set<OptEvent> findAllEventsInRange(double longitude, double latitude);
Run Code Online (Sandbox Code Playgroud)
通常我会写这样的规范,然后可以将它们串在一起。取决于是否应用过滤器。
public static Specification<OptEvent> filterArea(Double longitude, Double latitude) {
return new Specification<OptEvent>() {
@Override
public Predicate toPredicate(Root<OptEvent> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
SpatialRelateExpression geomExpression = SpatialRestrictions.within("locationpoint ", area);
//this is the only thing i could find, but i have no idea if its the right path or how i can transform it to the …Run Code Online (Sandbox Code Playgroud) hibernate spatial spring-data-jpa hibernate-spatial spring-boot
我正在尝试查询我的实体之间的空间关系,但一直得到这个异常:
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 1,
Run Code Online (Sandbox Code Playgroud)
我的实体工作正常,映射也是如此.我相信我的查询有问题:
SELECT r FROM Regiao r, Imovel i WHERE r.nivel = :nivel AND contains(r.regiao, i.latlng)
Run Code Online (Sandbox Code Playgroud)
其中r.regiao和i.latln都是GeometryType映射的(一个是Polygon,另一个是Point.
Ps.:当我问这个问题时,我终于理解了这个问题.
这是我现在的配置。我想使用休眠空间在生产中使用 postgis。
spring:
profiles: production
datasource:
platform: postgres
url: jdbc:postgresql://192.168.99.100:5432/dragon
username: dragon
password: dragon
database:
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
show-sql: true
hibernate:
ddl-auto: update
---
spring:
profiles: development
datasource: SpatialInMemoryDb
jpa:
database-platform: org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
hibernate:
ddl-auto: create-drop
Run Code Online (Sandbox Code Playgroud)
对于所有发现的测试都是 h2gis 项目。
public class SpatialInMemoryDb extends SingleConnectionDataSource{
public SpatialInMemoryDb() {
setDriverClassName("org.h2.Driver");
setUrl("jdbc:g2:mem:test");
setSuppressClose(true);
}
@Override
public Connection getConnection() throws SQLException {
System.out.println("************");
Connection connection = super.getConnection();
try (Statement st = connection.createStatement()) {
// Import spatial functions, domains and drivers
// …Run Code Online (Sandbox Code Playgroud) hibernate ×7
java ×6
postgis ×4
geometry ×2
h2 ×2
jpa ×2
spring-boot ×2
criteria-api ×1
geospatial ×1
jpql ×1
postgresql ×1
spatial ×1
spring ×1
spring-data ×1