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)); } }; } ... ... ...
ไม่มีความคิดเห็น:
แสดงความคิดเห็น