Как я могу использовать SimpleExpression.eqAny в рамках mysema?

Я смотрю на фильтрацию в моем запросе, чтобы вернуть объекты, где locations пересекается с запросами местоположений. Из сигнатуры метода кажется, что eqAny Метод это путь.

Единственным недостатком является то, что он не принимает коллекцию, а только коллекционное выражение. Как мне создать CollectionExpression из моей коллекции?

Мой (не компилируемый) код выглядит так:

import com.mysema.query.types.expr.BooleanExpression;
//…
StringPath locations = … //irrelevant
BooleanExpression predicate = anotherPredicate.and(qbuilder.locations.eqAny(query.getLocations().orElse(new HashSet<>())));

0 ответов

Я почти уверен, что вы нашли решение спустя столько времени, однако, поскольку я столкнулся с той же проблемой (и не смог найти никакой помощи о том, как это сделать), я публикую свое собственное решение на случай, если кто-то находится в том же месте.

Во-первых, предположим, что мой класс следующий,

public class MyClass {

    private String id;
    private String name;

    // All the Getters, Setters, Constructors, etc
}

В результате эквивалентный автоматически сгенерированный класс QueryDSL будетQMyClass

Что я сделал, так это вручную создать свое BooleanExpression, перебирая мою коллекцию, что-то вроде следующего (предположим, что коллекцииList<String> ids а также List<String> names),

QMyClass myClass = QMyClass.myClass;

BooleanExpression be = null;

if (!CollectionUtils.isEmpty(ids)) {
   be = myClass.id.equalsIgnoreCase(ids.get(0));
   if (ids.size() > 1) {
       for (int i = 1; i < ids.size(); i++) {
           be = be.or(myClass.id.equalsIgnoreCase(ids.get(i)));
       }
   }
}

if (!CollectionUtils.isEmpty(names)) {
   be = be.and(myClass.name.equalsIgnoreCase(names.get(0)));
   if (names.size() > 1) {
      for (int i = 1; i < names.size(); i++) {
          be = be.or(myClass.name.equalsIgnoreCase(names.get(i)));
      }
   }
}

После этого все остальное было легко. Мне просто пришлось расширить интерфейс MyClassRepository следующим образом (чтобы воспользоваться функциями QueryDSL):

public interface MyClassRepository extends extends JpaRepository<MyClass, Serializable>, QuerydslPredicateExecutor {

...

}

Наконец, я использовал метод findAll Repository (расширенный сейчас, конечно, по умолчанию из-за QueryDSL) следующим образом (я также использовал Pageable для своего случая, но это, конечно, необязательно),

Page<MyClass> myClassList = this.myClassRepository(be, pageable);
Другие вопросы по тегам