【问题标题】:QueryDSL Predicate SetPath.any with multiple conditionsQueryDSL Predicate SetPath.any 有多个条件
【发布时间】:2016-11-27 04:24:32
【问题描述】:

我有一个具有一对多关系的简单实体

@Entity // and other @ stuff
public class Member {
  @Id
  private Long id;
  private String name;
  private List<Program> programs;
  ...
}

@Entity
public class Program {
   @Id
   private Long id;
   private Long programName;
   private ProgramType programType;
   private Long programCost;
   ...
}

现在使用QueryDSL,我想查询 '所有成员都注册了 programType = "FULLTIME" 且 programCost > $1000'

我使用了以下谓词

Predicate predicate = QMember.member.programs.any()
    .programType.eq(ProgramType.FULLTIME)
      .and(QMember.member.programs.any().programCost.gt(1000));

使用 JPARepository

memberRepository.findAll(predicate);

现在的问题是这两个查询是独立的。它返回具有至少一个“FULLTIME”类型程序或至少一个成本大于 1000 的程序的所有成员。

期望的结果:如果他有至少一个 FULLTIME 类型且成本 > 1000 的程序,则返回成员。

【问题讨论】:

    标签: java spring-data-jpa querydsl


    【解决方案1】:

    在这里得到一些帮助:https://groups.google.com/forum/#!topic/querydsl/hxdejLyqXos

    基本上程序上的条件需要在一个单独的子查询中(一个JPASubquery实例)

    QProgram program = QProgram.program
    JPASubQuery subQuery = new JPASubQuery();
    subQuery.from(program)
            .where(program.programType.eq(ProgramType.FULLTIME),
                program.programCost.gt(1000));
    
    Predicate predicate = QMember.member.name.eq("John")
        .and(subQuery.exists());
    
    memberRepository.findAll(predicate);
    

    【讨论】:

    • 我认为这个例子对于 querydsl 4.x 来说已经过时了
    • 在 mongodb 的情况下如何处理? jpa 是关系型的?
    • 这个解决方案缺少程序和成员之间的链接。它应该在子查询中包含一个额外的 where 子句:program.in(QMember.member.programs)
    【解决方案2】:

    正如@Shahbour 所提到的,这不再适用于 QueryDsl 4.x+。

    我有一个类似的情况(除了我的实体是双向的),我已经解决了这个问题:

    QProgram program = QProgram.program;
    QProgram member  = QProgram.member;
    
    Predicate predicate = JPAExpressions
        .selectOne()
        .from(program)
        .where(program.member.id.eq(member.id),
                program.programCost.gt(1000),
                program.programType.eq(ProgramType.FULLTIME))
        )
        .exists();
    
    memberRepository.findAll(predicate);
    

    【讨论】:

    • 我对声明的前两行感到困惑,您使用的是不同的示例吗? QProgram 没有成员路径?
    猜你喜欢
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2016-03-06
    • 2013-05-30
    相关资源
    最近更新 更多