0

First Issue: I have an existing code written for hibernate spatial 5 to find records within given radius, which works fine. I am in the process of migrating the code hibernate-spatial 6.1.7.Final. But getting below error:

java.lang.IllegalArgumentException: Passed `invariantType` for function return cannot be null
    at org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers.invariant(StandardFunctionReturnTypeResolvers.java:45) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final]
    at org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder.function(SqmCriteriaNodeBuilder.java:1495) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final]
    at org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder.function(SqmCriteriaNodeBuilder.java:153) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final]
    at com.adani.amm.specification.AssetLocationSpecification.toPredicate(AssetLocationSpecification.java:35) ~[classes/:na]

As per my debugging so far, it seems that POSTGIS geography function is not supported in the version. Below is a snippet of my code.

public class AssetLocationSpecification implements Specification<Location> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private final Double radius;
    private final Double latitude;
    private final Double longitude;

    public AssetLocationSpecification(Double radius, Double latitude, Double longitude) {
        super();
        this.radius = radius;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    @Override
    public Predicate toPredicate(Root<Location> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
        Expression<Geometry> geography = criteriaBuilder.function("geography", Geometry.class, root.get("geometry"));
        Expression<Point> point = criteriaBuilder.function("ST_Point", Point.class, criteriaBuilder.literal(longitude),
                criteriaBuilder.literal(latitude));
        Expression<Point> centerPoint = criteriaBuilder.function("ST_SetSRID", Point.class, point,
                criteriaBuilder.literal(4326));
        Expression<Boolean> expression = criteriaBuilder.function(SpatialFunction.dwithin.toString(), boolean.class,
                geography, centerPoint, criteriaBuilder.literal(radius));
        return criteriaBuilder.equal(expression, true);
    }
}

Second Issue: org.hibernate.spatial.SpatialFunction.dwithin is deprecated and replacement enum (org.hibernate.spatial.CommonSpatialFunction) does not contain that function.

Brian Clozel
  • 56,583
  • 15
  • 167
  • 176

0 Answers0