hibernate-spatial запрос расстояния jpa

Я пытаюсь запросить ближайшие 10 точек доступа из моей базы данных mysql, вот мой объект JPA:

@Entity
public class HotSpot {

    @Id
    @GeneratedValue
    public Long Id;

    @Type(type="org.hibernate.spatial.GeometryType")
    public Point location;

    @Transient
    private Double distance;

    public HotSpot( Point location ) {
        this.location = location;
    }
}

вот как я пытаюсь запросить:

Query query = em.createQuery("SELECT location, distance( location, :p ) FROM HotSpot");
GeometryFactory gf = new GeometryFactory();
Geometry p = gf.createPoint(new Coordinate(longitude, latitude, 0));
query.setParameter("p", p );
List ret = query.getResultList();

и вот моя трассировка стека:

13:30:55,281 ERROR [org.jboss.as.server] (management-handler-thread - 2) JBAS015870: Deploy of deployment "Netector.war" was rolled back with the following failure message: 
{"JBAS014671: Failed services" => {"jboss.persistenceunit.\"Netector.war#forge-default\"" => "org.jboss.msc.service.StartException in service jboss.persistenceunit.\"Netector.war#forge-default\": java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 \\-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'distance' {originalText=distance}
    \\-[EXPR_LIST] SqlNode: 'exprList'
       +-[DOT] DotNode: 'hotspot0_.`location`' {propertyName=location,dereferenceType=PRIMITIVE,getPropertyPath=location,path=a.location,tableAlias=hotspot0_,className=com.entity.HotSpot,classAlias=a}
       |  +-[ALIAS_REF] IdentNode: '(hotspot0_.`id`, hotspot0_.`provider`)' {alias=a, className=com.entity.HotSpot, tableAlias=hotspot0_}
       |  \\-[IDENT] IdentNode: 'location' {originalText=location}
       \\-[NAMED_PARAM] ParameterNode: '?' {name=p, expectedType=null}

    Caused by: java.lang.IllegalStateException: No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 
 \\-[METHOD_CALL] MethodNode: '('
    +-[METHOD_NAME] IdentNode: 'distance' {originalText=distance}
    \\-[EXPR_LIST] SqlNode: 'exprList'
       +-[DOT] DotNode: 'hotspot0_.`location`' {propertyName=location,dereferenceType=PRIMITIVE,getPropertyPath=location,path=a.location,tableAlias=hotspot0_,className=com.entity.HotSpot,classAlias=a}
       |  +-[ALIAS_REF] IdentNode: '(hotspot0_.`id`, hotspot0_.`provider`)' {alias=a, className=com.entity.HotSpot, tableAlias=hotspot0_}
       |  \\-[IDENT] IdentNode: 'location' {originalText=location}
       \\-[NAMED_PARAM] ParameterNode: '?' {name=p, expectedType=null}
"}}

любые подсказки ОЧЕНЬ ценятся :))) Заранее спасибо!


person Sławomir Ossowski    schedule 01.07.2015    source источник
comment
возможный дубликат Нет типа данных для узла: org.hibernate.hql.internal.ast.tree.IdentNode HQL   -  person InbetweenWeekends    schedule 01.07.2015
comment
Итак, как вы ожидаете, что Hibernate сопоставит ваш Point с базой данных? Что такое соответствующий столбец (столбцы)?   -  person DuncanKinnear    schedule 02.07.2015


Ответы (1)


Сначала проверьте, установлен ли hibernate.dialect соответствующий диалект H-S в persistence.xml.

Во-вторых, попробуйте использовать POJO для получения данных, чтобы Hibernate мог определить тип цели (предупреждение, код не тестировался):

public static class DistanceResult{
     public final Point location;
     public final Double distance; 

     public  DistanceResult(Point location, Double distance){
         this.location = location;
         this.distance = distance;
     }

}

// .....
TypedQuery<DistanceResult> query = em.createQuery(
      "SELECT new myPackage.MyClass.DistanceResult(location, distance( location, :p )) FROM HotSpot", 
      DistanceResult.class);
GeometryFactory gf = new GeometryFactory();
Geometry p = gf.createPoint(new Coordinate(longitude, latitude, 0)); 
query.setParameter("p", p );
List<DistanceResult> ret = query.getResultList();

Удачи!!

person jmvivo    schedule 02.07.2015