代码之家  ›  专栏  ›  技术社区  ›  flopcoder

Hibernate spatial jpa查询不工作

  •  2
  • flopcoder  · 技术社区  · 7 年前

    我编写了空间查询来从一个位置查找最近的点。但hibernate出现异常。 我的Spring boot 1.5.7应用程序

    @Repository
    @Transactional(readOnly = true)
    public interface PlaceRepository extends JpaRepository<PlaceEntity, Long> {
        PlaceEntity findByCode(String code);
        PlaceEntity findByName(String name);
        @Query("select l from PlaceEntity l where within(l.location, :filter) = true")
        List<PlaceEntity> findLocationWithin(Geometry filter);
    }
    

    这里是我的实体类参数

    @Data
    @Entity(name = "Place")
    public class PlaceEntity extends BaseEntity {
    
    @Type(type = "org.hibernate.spatial.GeometryType")
    @Column(name = "LOCATION",columnDefinition = "POINT")
        private Point location;
    }
    

    其他参数为

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private long id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "CODE")
    private String code;
    @Column(name = "LONGITUDE")
    private Double longitude;
    @Column(name = "LATITUDE")
    private Double latitude;
    

    这是我的版本。格拉德尔。

    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.hibernate:hibernate-core:4.3.0.Final')
    compile("org.hibernate:hibernate-spatial:4.3")
    compile("org.hibernate:hibernate-entitymanager:4.3.0.Final")
    compile('mysql:mysql-connector-java')
    compile('org.projectlombok:lombok:1.14.8')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('com.vividsolutions:jts:1.13')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    

    配置

    @EnableWebMvc
    @Configuration
    public class AppConfig {
    
    }
    

    但当我部署服务器时,会出现异常。

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pathController': Unsatisfied dependency expressed through field 'pathService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pathServiceImpl': Unsatisfied dependency expressed through field 'placeRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.fm.assignment.core.dao.PlaceRepository.findLocationWithin(com.vividsolutions.jts.geom.Geometry)!
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
    
    
    
    Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pathServiceImpl': Unsatisfied dependency expressed through field 'placeRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.fm.assignment.core.dao.PlaceRepository.findLocationWithin(com.vividsolutions.jts.geom.Geometry)!
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:58
    
    
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.fm.assignment.core.dao.PlaceRepository.findLocationWithin(com.vividsolutions.jts.geom.Geometry)!
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
    
    
    
    Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.fm.assignment.core.dao.PlaceRepository.findLocationWithin(com.vividsolutions.jts.geom.Geometry)!
            at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:92)
            at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:62)
    
    
    Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: PlaceEntity is not mapped [select l from PlaceEntity l where within(l.location, :filter) = true]
            at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
            at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    
    
    
    Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: PlaceEntity is not mapped [select l from PlaceEntity l where within(l.location, :filter) = true]
            at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96)
            at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120)
    
    
    
    
    Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: PlaceEntity is not mapped
            at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189)
            at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109)
            at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95)
    

    我的配置有错误吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   panser    6 年前

    将来在spring数据jpa存储库中使用变量,如 保护自己免受此类错误的伤害

    @Query("select l from #{#entityName} l where within(l.location, :filter) = true")
    
        2
  •  1
  •   Nico Van Belle    7 年前

    您已命名您的实体 位置 ( @Entity(name = "Place") )但你仍然使用 PlaceEntity公司 在jpql查询中。

    像这样试试;

    select l from Place l where within(l.location, :filter) = true
    

    或者继续使用 PlaceEntity 并使用以下注释;

    @Data
    @Entity
    @Table(name ="Place")
    public class PlaceEntity extends BaseEntity {}