如何解决QueryDSL动态表联接
我在弄清楚我想做的事情是否可行以及如何实现时遇到了麻烦。 我有三个通过唯一标识符连接的表。
public class Teams{
private UUID teamUuid;
private Integer state;
}
public class TeamGoals{
private UUID teamGoalUuid;
prviate UUID teamUuid;
private UUID CauseOrgUuid
public class CauseOrgMap {
private UUID causeOrgUuid;
private UUID organization;
private UUID cause;
}
我正在尝试从Teams表中检索数据。我输入的是原因UUID,CauseOrgMap中的组织UUID,Teams表中的状态或三者的任意组合或不组合(在这种情况下,应返回整个Teams表)。
public List<Teams> findTeamsListByCauseOrgState(String cause,String org,Integer state,Boolean featured) {
QTeams team = QTeams.teams;
QCauseOrgMap causeOrgMap = QCauseOrgMap.causeOrgMap;
QTeamGoals teamGoals = QTeamGoals.teamGoals;
BooleanBuilder booleanBuilder = new BooleanBuilder();
List<Teams> teamList = queryFactory.selectFrom(team)
.where(
isStateDefined(state.toString())).fetch();
//NO IDEA HOW TO ADD JOINS
return teamList;
}
private BooleanExpression isStateDefined(String state){
return state != null ? QTeams.teams.teamState.like(state) : null;
}
因此,我需要根据输入的输入组合来创建动态的谓词。我遇到的问题是通过TeamGoals使CauseOrgMap上的联接动态化。如果没有因果关系或组织单位的UUID,则无需进行任何联接。
我猜我可以用BooleanExpression或BooleanBuilder来构建谓词,但是我空了。
有什么想法吗?
更新
更多阅读和工作后,我认为我可能有解决方案。它可以编译,但是我还不能测试它。
如果有效,我将更新并回复该帖子。
同时,如果有更好的方法,任何反馈仍将不胜感激。
QTeams team = QTeams.teams;
QCauseOrgMap causeOrgMap = QCauseOrgMap.causeOrgMap;
QTeamGoals teamGoals = QTeamGoals.teamGoals;
BooleanBuilder dynamicWhere = new BooleanBuilder();
Pageable pageable = new OffsetBasedPageRequest(offset,limit); //Custom Pagable implementation
dynamicWhere.and(Expressions.asBoolean(true).isTrue());
if(cause != null){
dynamicWhere.and(team.teamUuid.in(JPAExpressions.select(teamGoals.team.teamUuid).from(teamGoals).where(teamGoals.causeOrg.cause.causeUuid.eq(cause))));
}
if(org != null){
dynamicWhere.and(team.teamUuid.in(JPAExpressions.select(teamGoals.team.teamUuid).from(teamGoals).where(teamGoals.causeOrg.organization.orgUuid.eq(org))));
}
if(state != null){
dynamicWhere.and(team.teamState.eq(state);
}
Page<Teams> teamList = teamsRepository.findAll(dynamicWhere,pageable);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。