具有多个条件的QueryDSL Predicate SetPath.any

Pra*_*jal 9 java querydsl spring-data-jpa

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

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

现在使用QueryDSL,我想查询'所有注册程序的成员,程序类型="FULLTIME"和programCost> $ 1000'

我使用了以下谓词

Predicate predicate = QMember.member.programs.any()
    .programType.eq(ProgramType.FULLTIME)
      .and(QMember.member.programs.any().programCost.gt(1000));
Run Code Online (Sandbox Code Playgroud)

使用JPARepository

memberRepository.findAll(predicate);
Run Code Online (Sandbox Code Playgroud)

现在的问题是这两个查询是独立的.它返回al成员至少有一个类型为'FULLTIME'的程序或至少一个成本大于1000的程序.

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

Pra*_*jal 14

在这里得到一些帮助: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);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个示例对于querydsl 4.x已经过时了 (2认同)

Tho*_*mas 7

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