如何使用Spring Data Specification连接两个结果

a7qyws3x  于 12个月前  发布在  Spring
关注(0)|答案(1)|浏览(95)

如何在使用Criteriabuilder时连接两个结果
我使用CriteriaBuilder,其中我使用两个表Student和StudentResult。
查询API时
http://localhost:8080/student?query=grade:5,lastRollResult%40SUCCESS%23FAILURE
在这种情况下,我可以从Join results = root.join("lastRollResult", JoinType.INNER);获取数据,这是从StudentResult Table获取的。
类似地,当我传递null值作为lastRollResult时,我从return root.get("lastRunId");获取数据,这是从学生表中获取的,因为没有结果,所以结果列为null。
我的问题是如何连接这两个结果,当我传递任何枚举,如成功或失败与null。

@Override
protected Expression<String> getPath(SearchCriteria criteria, Root<Student> root) {
  if (criteria.getKey().equals("lastRollResult"))  { // codition check null. avoid join. 
    if (!"null".equals(criteria.getValue())) {
      Join results = root.join("lastRollResult", JoinType.INNER);
      return results.get("result");
    } else {
      return root.get("lastRollId");
    }
}
  return root.get(criteria.getKey());
}

字符串
这是我的类定义:
public abstract class BaseSpecification<M> implements Specification<M>

sgtfey8w

sgtfey8w1#

你可以通过使用criteriaBuilder.selectCase()来实现条件连接,这里是一个如何修改代码的例子。

@Override
protected Expression<String> getPath(SearchCriteria criteria, Root<Student> root, CriteriaBuilder criteriaBuilder) {
    if (criteria.getKey().equals("lastRollResult")) {
        Path<Object> lastRollResultPath = root.get("lastRollResult");

        Expression<String> successExpression = criteriaBuilder.selectCase()
                .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.SUCCESS), root.join("lastRollResult", JoinType.INNER).get("result"))
                .otherwise((Expression<String>) root.get("lastRollId"));

        Expression<String> failureExpression = criteriaBuilder.selectCase()
                .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.FAILURE), root.join("lastRollResult", JoinType.INNER).get("result"))
                .otherwise((Expression<String>) root.get("lastRollId"));

        return criteriaBuilder.selectCase()
                .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.SUCCESS), successExpression)
                .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.FAILURE), failureExpression)
                .otherwise((Expression<String>) root.get("lastRollId"));
    }

    return root.get(criteria.getKey());
}

字符串
在这个例子中,我使用了criteriaBuilder.selectCase(),它创建了一个基于lastRollResult的条件表达式。如果成功,它将连接lastRollResult表并获取result列,否则它将返回Student表中的lastRollResult

请确保根据您的需要进行代码调整,这只是一个示例。

相关问题