QueryDSL: как получить аргумент из объекта PathMetadata

Если я создам такой предикат foo.bar=1234

PathBuilder<?> entityPath = new PathBuilder("foo");
NumberPath<BigDecimal> path = entityPath.getNumber("bar", BigDecimal.class);
Predicate predicate = path.eq(BigDecimal.valueOf(1234));

Как мне потом найти значение аргумента (1234)?

Моя попытка до сих пор:

Path<?> path = (Path<?>) predicate.accept(PathExtractor.DEFAULT, null);
PathMetadata<?> md = path.getMetadata();

if(md.getExpression().toString().equals("bar")) {
   Object val = md.getPathType().VARIABLE;    // probably already a wrong approach...
   if(val instanceof BigDecimal) {
   // doesn't work
   }
}

Обновление, зачем мне это нужно: Наше веб-приложение позволяет пользователям создавать собственные поисковые запросы к БД, их можно сохранять/загружать в/из базы данных (используя JAXB). Каждый запрос состоит из одного или нескольких ограничений, соответствующих предикатам QueryDSL. Часть приложения, которая сама выполняет поиск, должна среди прочего изучать предикаты, чтобы определить, какие таблицы БД используются для формирования соединений JOIN и т. д.


person kosmičák    schedule 10.09.2013    source источник


Ответы (1)


foo.bar=1234 — это операция, foo и foo.bar — экземпляры пути, а 1234 — константа.

Вы можете извлечь константу для 1234, приведя предикат к операции

Constant constant = (Constant)((Operation)predicate).getArg(1);

Каков ваш вариант использования для этого?

person Timo Westkämper    schedule 10.09.2013