QueryDSL谓词SetPath.any具有多个条件



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

@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));

带有JPAR存储

memberRepository.findAll(predicate);

现在的问题是这两个查询是独立的。它返回所有成员,其中至少有一个程序类型为"FULLTIME"或至少有一项程序的开销大于1000。

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

这里有一些帮助:https://groups.google.com/forum/#!主题/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);

正如@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);

最新更新