หน้าเว็บ

วันจันทร์ที่ 24 กันยายน พ.ศ. 2555

Sub Query Qriteria JPA Eclipse Link + Spring Data : Java

เข้าใจ Dynamic Query Qriteria JPA Eclipse Link + Spring Data : Java : http://na5cent.blogspot.com/2012/09/dynamic-query-qriteria-jpa-eclipse-link.html

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));
            }
        };
    }
...
...
...

ไม่มีความคิดเห็น:

แสดงความคิดเห็น