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

a7qyws3x  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(121)

如何在使用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。

  1. @Override
  2. protected Expression<String> getPath(SearchCriteria criteria, Root<Student> root) {
  3. if (criteria.getKey().equals("lastRollResult")) { // codition check null. avoid join.
  4. if (!"null".equals(criteria.getValue())) {
  5. Join results = root.join("lastRollResult", JoinType.INNER);
  6. return results.get("result");
  7. } else {
  8. return root.get("lastRollId");
  9. }
  10. }
  11. return root.get(criteria.getKey());
  12. }

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

sgtfey8w

sgtfey8w1#

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

  1. @Override
  2. protected Expression<String> getPath(SearchCriteria criteria, Root<Student> root, CriteriaBuilder criteriaBuilder) {
  3. if (criteria.getKey().equals("lastRollResult")) {
  4. Path<Object> lastRollResultPath = root.get("lastRollResult");
  5. Expression<String> successExpression = criteriaBuilder.selectCase()
  6. .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.SUCCESS), root.join("lastRollResult", JoinType.INNER).get("result"))
  7. .otherwise((Expression<String>) root.get("lastRollId"));
  8. Expression<String> failureExpression = criteriaBuilder.selectCase()
  9. .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.FAILURE), root.join("lastRollResult", JoinType.INNER).get("result"))
  10. .otherwise((Expression<String>) root.get("lastRollId"));
  11. return criteriaBuilder.selectCase()
  12. .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.SUCCESS), successExpression)
  13. .when(criteriaBuilder.equal(lastRollResultPath, EnumResult.FAILURE), failureExpression)
  14. .otherwise((Expression<String>) root.get("lastRollId"));
  15. }
  16. return root.get(criteria.getKey());
  17. }

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

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

展开查看全部

相关问题