用于ManyToMany的QueryDSL代码生成

Adr*_*Cox 3 java hibernate jpa querydsl

我在一个大的Hibernate/JPA2应用程序中移植了一些复杂的JPQL查询以使用QueryDSL 2.3.0,而我却陷入其中.

我的Client实体包含

@ManyToMany
private List<Group> groups;
Run Code Online (Sandbox Code Playgroud)

我现有的查询片段是

EXISTS(SELECT g FROM Group g WHERE g MEMBER OF slr.groups AND 
             UPPER(g.description) LIKE :group)
Run Code Online (Sandbox Code Playgroud)

QueryDSL代码生成在我的QClient类中产生了以下内容:

public final SimplePath<java.util.List<Group>> groups = 
          createSimple("groups", java.util.List.class);
Run Code Online (Sandbox Code Playgroud)

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

Adr*_*Cox 5

我有一个答案.这看起来像是在QueryDSL 2.2.5中引入的一个错误,只有在Eclipse中工作时才会发生.

正确的解决方案是不使用Eclipse来生成源(不要启用注释处理).相反,我正在m2eclipseMaven中使用并生成源代码.


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

public final ListPath<Group, QGroup> fixedgroups = 
                  createList("groups", Group.class, QGroup.class);
Run Code Online (Sandbox Code Playgroud)

那时相当于我的原始查询是:

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());
Run Code Online (Sandbox Code Playgroud)

(query这是更大的查询.slrQQClient左连接引入外部查询的实例.)

  • 谢谢 - 我在问题开始前一天才开始使用QueryDSL,所以我首先想到的是一个错误.切换到QueryDSL大大提高了查询代码的可读性 (2认同)