2011-12-23 139 views
3

我在大型Hibernate/JPA2应用程序中移植一些复杂的JPQL查询以使用QueryDSL 2.3.0,并且我被困在一个上。ManyToMany的QueryDSL代码生成

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使用正确的类型查询集合?

+0

可能存在以下问题:https://groups.google.com/forum/#!topic/querydsl/xTgCUJ79fgY – 2011-12-23 20:32:26

+0

因此,您没有使用Maven? – ponzao 2011-12-23 20:49:35

+0

我一直在试用QueryDSL时使用Eclipse,计划一旦习惯了这个工具就转移到Maven。发现了这个可能的bug后,我将尝试使用Maven来处理构建。 – 2011-12-23 20:53:25

回答

4

我有一个答案。这看起来像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是大的查询,这是的一部分。slr是一个实例由左连接引入外部查询。)

+1

我们将在假期后修复此错误。使用Eclipse中的2.2.4和Maven中的更新版本中的单个jar可能是另一种临时修复。 – 2011-12-25 20:39:48

+2

谢谢 - 我只是在问题出现前的一天才开始使用QueryDSL,所以一个错误并不是我的第一个想法。切换到QueryDSL大大提高了我的查询代码的可读性 – 2011-12-26 10:32:22