@taluks
какой бесполезный сайт(

JPA Как описать условие для фильтра по дистанции на карте (функция earth_box)?

Пытаюсь добавить условие в запрос фильтра, использую спецификации (фреймворк RSQL).
Не понимаю как это описать в java со спецификациями. Помогите кому не сложно как правильно вызвать метод "earth_box" и отфильтровать точки из таблицы? Какие java типы возвращают функции "ll_to_earth" и "earth_box" ? Как написать сравнение с оператором "@>" ?
spec = Specification.where(spec).and((Specification<MYPoint>) (root, query, cb) -> {
            Expression<?> point1 = cb.function("ll_to_earth", Double.class,
                    root.get("latitude"), root.get("longitude"));
            Expression<?> point2 = cb.function("ll_to_earth", Double.class,
                    cb.literal("57.65"), cb.literal("38.38"));

            // Какой тут тип соответствует?
            Expression<?> earthBox = cb.function("earth_box", Boolean.class, point1, cb.literal(150d));
           // Как описать оператор  "@>" 
            return cb.isTrue(...);
        });
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
@taluks Автор вопроса
какой бесполезный сайт(
Решение.
Регистрируем новую функцию в диалекте, у меня hibernate 6.3.1:
public class CustomPostgreSQL10Dialect extends PostgreSQLDialect {

    @Override
    public void initializeFunctionRegistry(FunctionContributions functionContributions) {
        super.initializeFunctionRegistry(functionContributions);
        SqmFunctionRegistry functionRegistry = functionContributions.getFunctionRegistry();
        TypeConfiguration typeConfiguration = functionContributions.getTypeConfiguration();

        BasicTypeRegistry basicTypeRegistry = typeConfiguration.getBasicTypeRegistry();
        functionRegistry.patternDescriptorBuilder("@>", "(?1 @> ?2)")
                .setExactArgumentCount(2)
                .setParameterTypes(ANY, ANY)
                .setInvariantType(basicTypeRegistry.resolve(StandardBasicTypes.BOOLEAN))
                .register();
    }
}

Меняем в конфигурациях диалект на свой:
spring.jpa.properties.hibernate.dialect = com.package.CustomPostgreSQL10Dialect


Дальше дописываем условие:
spec = Specification.where(spec).and((Specification<MyPoint>) (root, query, cb) -> {
            Expression<Double> point1 = cb.function("ll_to_earth", Double.class,
                    root.get("latitude"), root.get("longitude"));
            Expression<Double> point2 = cb.function("ll_to_earth", Double.class,
                   cb.literal("57.65"), cb.literal("38.38"));
            Expression<?> earthBox = cb.function("earth_box", Object.class, point1, cb.literal(150d));
            return cb.isTrue(cb.function("@>", Boolean.class, earthBox, point2));
        });
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 апр. 2024, в 20:14
700 руб./за проект
28 апр. 2024, в 20:09
9000 руб./за проект
28 апр. 2024, в 19:54
2000 руб./за проект