2011-12-23 2 views
3

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

Мой 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 d oesn't позвольте мне использовать методы in или contains для запроса членства. Мне кажется, мне нужен CollectionPath. Есть ли способ аннотировать класс Client, чтобы QueryDSL использовал правильный тип для запроса коллекции?

+0

Возможно, эта проблема: https://groups.google.com/forum/#!topic/querydsl/xTgCUJ79fgY –

+0

Значит, вы не используете Maven? – ponzao

+0

Я использую Eclipse, когда вы пытаетесь выполнить QueryDSL, планируя перейти к Maven, когда я привык к инструменту. Найдя эту возможную ошибку, я попытаюсь использовать Maven для обработки сборки. –

ответ

4

У меня есть ответ. Это выглядит как a bug introduced in QueryDSL 2.2.5, which only happens when working in 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, введенный во внешний запрос левым соединением.)

+1

Мы исправим эту ошибку после праздников. Использование одной банки из 2.2.4 в Eclipse и более новые версии в Maven может быть альтернативным временным исправлением. –

+2

Спасибо - я только начал использовать QueryDSL за день до вопроса, поэтому ошибка не была моей первой мыслью. Переключение на QueryDSL значительно улучшило читаемость моего кода запроса –

Смежные вопросы