JPA Repositories
SELECT s
FROM Staff s
WHERE s.staffId NOT IN(
SELECT u.staffId
FROM User u
WHERE u.disabled = false
)
Specification
...
...
...
public static Specification<Staff> notInUser() {
return new Specification<Staff>() {
@Override
public Predicate toPredicate(Root<Staff> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//(1)
//create sub query จาก query object
//[SELECT u.staffId WHERE u.disabled = false]
//และบ่งบอกว่าสิ่งที่เราจะ select นั้น จะ return ออกมาเป็น type อะไร
//เช่นในที่นี้ sub query จะ return เป็น staffId(String type)
Subquery<String> sq = query.subquery(String.class);
//(2)
//ใช้ sub query create sub root คือ root ข้างในที่เราจะอ้างถึง ซึ่งก็คือ User นั่นเอง
//การ create sub root ต้องใช้ sub query object สร้างเท่านั้น ใช้ query object สร้างไม่ได้
//[FROM User u]
Root<User> user = sq.from(User.class);
//(3)
//บอกว่าจะ select field ข้อมูลอะไร โดยจะต้องมี type ตรงกับที่ระบุไว้ตอน create sub query
//ในที่นี้คือ staffId(String type)
//[SELECT u.staffId]
sq.select(user.get(User_.staffId));
//(4)
//สร้างเงื่อนไขการ select ภายใน sub query
//[WHERE u.disabled = false]
Predicate equal = cb.equal(user.get(User_.disabled), false);
//(5)
//sub query => [SELECT u.staffId FROM User u WHERE u.disabled = false]
sq.where(equal);
//(6)
//return statement
//[WHERE s.staffId NOT IN (sub query)]
return cb.not(cb.in(root.get(Staff_.staffId)).value(sq));
}
};
}
...
...
...
ไม่มีความคิดเห็น:
แสดงความคิดเห็น