Есть ли способ получить условие Predicate<T> в виде строки?

Я изучаю JDBC и думаю, что было бы забавно, если бы я передал карту значений для изменений и карту условий для метода update().

У меня есть что-то вроде:

public void update(Map<String, Serializable> valuesToChange, Map<String, Predicate<T>> mapOfConditions){...}

Как я могу получить строку теста предиката?

Допустим, у меня есть:

    predicateMap.put("id", id -> (int) id > 20);
    predicateMap.put("last_name", lastName -> lastName  == "Jobs");

Как получить условия в String, например:

lastName == "Вакансии" или id > 20

Мне это нужно как условие WHERE в SQL Query.

Ваше здоровье

Я не понимаю. Вы пытаетесь разобрать строку и найти/построить соответствующий объект Predicate?

Sotirios Delimanolis 11.12.2020 17:16

Если у меня есть предикат: id -> id == 20, я хочу получить строку: "id == 20"

MrFisherman 11.12.2020 17:32

Я не понимаю, что это значит. Может быть, если бы вы показали, как собираетесь его использовать...

Sotirios Delimanolis 11.12.2020 17:33

Я хочу преобразовать лямбда IN CODE в строковую форму. Я хочу использовать эту форму String позже в SQL-запросе. Итак, если у меня есть предикат: зарплата -> зарплата> 20000, я хочу получить строку «зарплата> 20000», чтобы использовать ее позже, например: «SELECT * WHERE зарплата> 20000;»

MrFisherman 11.12.2020 17:52

Lambdas — это элемент синтаксиса времени компиляции. В этом случае во время выполнения они просто Predicate объекты. Нет никакого способа изучить логику, которую они реализуют. Вместо того, чтобы хранить Predicate, сохраните Pair<Predicate, Something>, где Something генерирует SQL, необходимый для соответствующей проверки.

Sotirios Delimanolis 11.12.2020 17:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
669
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, о чем вы просите, почти невозможно. Это потребует от вас обратной компиляции байтового кода в предикате на Java и оттуда перевода Java на SQL. Я не могу поверить, что вы захотите взять на себя труд, в том числе потому, что выигрыш будет минимальным.

Это может показаться простым в случае, когда предикат id -> id == 20. Однако предикаты могут быть сложными. Они могут включать конструкции языка Java, не имеющие прямого аналога SQL. Они могут включать вызовы библиотечных методов, в том числе методов сторонних библиотек, даже удаленных служб и кода, написанного не на Java, а на других языках. Я не вижу возможности перевести все это на SQL.

Другие вопросы по теме