具有多个条件的 QueryDSL 谓词 SetPath.any
QueryDSL Predicate SetPath.any with multiple conditions
我有一个具有一对多关系的简单实体
@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,我想查询
'All members enrolled in a program with programType = "FULLTIME" and programCost > 00'
我使用了以下谓词
Predicate predicate = QMember.member.programs.any()
.programType.eq(ProgramType.FULLTIME)
.and(QMember.member.programs.any().programCost.gt(1000));
使用 JPARepository
memberRepository.findAll(predicate);
现在的问题是两个查询是独立的。它 returns 所有成员至少有一个 'FULLTIME' 类型的程序或至少一个成本大于 1000 的程序。
期望的结果:Return 成员,如果他至少有一个类型为 FULLTIME 且成本 > 1000 的程序。
在这里得到了一些帮助: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);
如@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);
我有一个具有一对多关系的简单实体
@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,我想查询 'All members enrolled in a program with programType = "FULLTIME" and programCost > 00'
我使用了以下谓词
Predicate predicate = QMember.member.programs.any()
.programType.eq(ProgramType.FULLTIME)
.and(QMember.member.programs.any().programCost.gt(1000));
使用 JPARepository
memberRepository.findAll(predicate);
现在的问题是两个查询是独立的。它 returns 所有成员至少有一个 'FULLTIME' 类型的程序或至少一个成本大于 1000 的程序。
期望的结果:Return 成员,如果他至少有一个类型为 FULLTIME 且成本 > 1000 的程序。
在这里得到了一些帮助: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);
如@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);