Создание кода QueryDSL для ManyToMany - PullRequest
3 голосов
/ 23 декабря 2011

Я портирую некоторые сложные запросы JPQL в большом приложении Hibernate / JPA2 для использования QueryDSL 2.3.0, и я застрял на одном.

Моя Client сущность содержит

@ManyToMany
private List<Group> groups;

Мой существующий фрагмент запроса:

EXISTS(SELECT g FROM Group g WHERE g MEMBER OF slr.groups AND 
             UPPER(g.description) LIKE :group)

Генерация кода QueryDSL произвела следующее в моем QClient классе:

public final SimplePath<java.util.List<Group>> groups = 
          createSimple("groups", java.util.List.class);

Генерация кода с использованием SimplePath hasnне позволяю мне использовать методы in или contains для запроса членства.Я думаю, что мне нужно CollectionPath вместо этого.Есть ли способ аннотировать класс Client, чтобы QueryDSL использовал правильный тип для запроса коллекции?

1 Ответ

5 голосов
/ 24 декабря 2011

У меня есть ответ. Это похоже на ошибку, введенную в QueryDSL 2.2.5, которая возникает только при работе в Eclipse .

Правильное решение - не использовать Eclipse для генерации источника (не включайте обработку аннотаций). Вместо этого я использую m2eclipse и генерирую источник в Maven.


Для справки, мой первый обходной путь состоял в том, чтобы расширить сгенерированный класс QClient с помощью моего собственного класса QQClient, который добавляет одного члена:

public final ListPath<Group, QGroup> fixedgroups = 
                  createList("groups", Group.class, QGroup.class);

В этот момент эквивалент моего исходного запроса:

QGroup g = QGroup.group;
JPQLSubQuery subquery = new JPQLSubQuery().from(g);
subquery = subquery.where(slr.fixedgroups.contains(g), 
    g.description.upper().like("%" + group.toUpperCase() + "%"));
query = query.where(subquery.exists());

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

...