问题描述
我在弄清楚我想做的事情是否可行以及如何实现时遇到了麻烦。 我有三个通过唯一标识符连接的表。
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 (将#修改为@)