【问题标题】:QueryDSL code generation for ManyToManyManyToMany的QueryDSL代码生成
【发布时间】:2011-12-23 14:43:49
【问题描述】:

我正在将一些复杂的 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 的代码生成不允许我使用incontains 方法来查询成员资格。我想我需要一个CollectionPath。有没有办法注释 Client 类,以便 QueryDSL 使用正确的类型来查询集合?

【问题讨论】:

  • 我在尝试 QueryDSL 时一直在使用 Eclipse,一旦我习惯了这个工具,就计划迁移到 Maven。找到这个可能的错误后,我将尝试使用 Maven 来处理构建。

标签: java hibernate jpa querydsl


【解决方案1】:

我有一个答案。这看起来像a bug introduced in QueryDSL 2.2.5, which only happens when working in Eclipse

正确的解决方法是不使用Eclipse生成源码(不启用注解处理)。相反,我使用 m2eclipse 并在 Maven 中生成源代码。


作为参考,我的第一个解决方法是使用我自己的 QQClient 类扩展生成的 QClient 类,它添加了一个成员:

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 是更大的查询,这是它的一部分。slrQQClient 的一个实例,通过左连接带入外部查询。)

【讨论】:

  • 我们会在假期结束后修复这个错误。在 Eclipse 中使用 2.2.4 中的 one-jar 和在 Maven 中使用更新版本可能是一种替代的临时修复。
  • 谢谢 - 我只是在提问前一天才开始使用 QueryDSL,所以我不是第一个想到的错误。切换到 QueryDSL 极大地提高了我的查询代码的可读性
猜你喜欢
  • 2019-03-25
  • 2019-05-31
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 2014-11-24
  • 2012-12-06
相关资源
最近更新 更多