【问题标题】:Spring Data - QueryDSL InnerJoin predicateSpring Data - QueryDSL InnerJoin 谓词
【发布时间】:2016-01-08 07:14:03
【问题描述】:

假设我们有以下领域对象(部分完成以减少代码)。

public class Student {
    @OneToMany(mappedBy="student")
    List<Assignment> assignments;
}


public class Assignment {

    @ManyToOne
    Student student;

    @OneToOne
    Implementation implementation;
}

public class Implementation {

    @OneToOne
    Assignment assignment;

    @OneToMany(mappedBy="implementation")
    List<Assessment> assessments;
}

public class Assessment {

    @ManyToOne
    Implementation implementation;

    String grade;
}

所以我要执行的查询是"Select all students whose assignment implementation has been performed (not null) and has not been assessed at all (List&lt;Assessment&gt;#isEmpty())

所以我使用QueryDSL 并尝试使用以下查询来获取未完成作业的学生

    public class MyService {

        @Autowired
        private StudentRepository studentRepository;

        public Iterable<Student> foo() {
            return studentRepository.findAll(
                QStudent.student.assignments.any().implementation.isNotNull()
            );
        } 
    }

上面的查询似乎被忽略了。

然后我用下面的方法得到组合(implemented exercises and empty assessments)

studentRepository.findAll(
    QStudent.student.assignments.any().implementation.isNotNull() 
      .and(QStudent.student.assignments.any().implementation.assessments.isEmpty())
);

同样,这没有区别。知道我做错了什么

【问题讨论】:

  • “并且上面的查询似乎被忽略了”是什么意思?即使不满足谓词,是否没有学生返回或全部返回?
  • 所有学生即使不满足谓词也会返回

标签: spring spring-data spring-data-jpa querydsl


【解决方案1】:

你试过这个吗:

QAssignment assignment = QAssignment.assignment;
ListSubQuery<Assignment> subQuery = new JPASubQuery().from(assignment)
    .where(assignment.implementation.isNotNull()))
    .and(assignment.implementation.assessments.isEmpty())
    .list(assignment);

studentRepository.findAll(
    QStudent.student.assignments.contains(subQuery)
);

我不确定您的代码为什么不起作用,但我想这是因为 any() 只是一个子查询存在的快捷方式。 见https://stackoverflow.com/a/25453708/2672352

【讨论】:

    猜你喜欢
    • 2015-01-21
    • 1970-01-01
    • 2018-04-06
    • 2019-01-28
    • 2020-09-18
    • 1970-01-01
    • 2020-09-23
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多