3

我正在一个大型 Hibernate/JPA2 应用程序中移植一些复杂的 JPQL 查询以使用 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);

using 的代码生成SimplePath不允许我使用inorcontains方法来查询成员资格。我想我需要一个CollectionPath。有没有办法对Client类进行注释,以便 QueryDSL 使用正确的类型来查询集合?

4

1 回答 1

5

我有一个答案。这看起来像是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

于 2011-12-23T20:50:25.547 回答