2011-12-23 47 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