2012-01-26 52 views
10

Đây là câu hỏi hơn nữa để này:Làm thế nào để sử dụng JPA Tiêu chuẩn API khi tham gia nhiều bảng

How to use JPA Criteria API in JOIN

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 

CriteriaQuery<Company> criteria = criteriaBuilder.createQuery(Company.class); 
Root<Company> companyRoot = criteria.from(Company.class); 
Join<Company,Product> products = companyRoot.join("dentist"); 
Join<Company, City> cityJoin = companyRoot.join("address.city");//Company->Address->City-city 
criteria.where(criteriaBuilder.equal(products.get("category"), "dentist"),      criteriaBuilder.equal(cityJoin.get("city"),"Leeds")); 

Một công ty đã một địa chỉ, bên trong địa chỉ đó là City-POJO và từng quốc gia Pojo. Làm thế nào tôi có thể sử dụng nó trong JOIN? Tôi cố gắng để tham khảo nó với address.city nhưng tôi đã nhận được thông báo lỗi:

Thuộc tính [address.city] từ kiểu quản lý [EntityTypeImpl @ 1692700229: Công ty [javaType: lớp com.test.domain.Company descriptor: RelationalDescriptor (com.test.domain.Company -> [DatabaseTable (COMPANY)]), ánh xạ: 16]] không có.

Trả lời

19

Nếu bạn sử dụng số Metamodel kinh điển, bạn sẽ tránh loại lỗi này. Trong mã của bạn, bạn đã lạm dụng từ khóa "nha sĩ", đó có thể là nguyên nhân gây ra lỗi của bạn, bởi vì "nha sĩ" không phải là một trường trong thực thể Công ty.

Tuy nhiên, nhìn vào cách bạn định nghĩa lớp học của bạn trong câu hỏi khác, cách để xác định rằng join sử dụng metamodel là thế này:

SetJoin<Company,Product> products = companyRoot.join(Company_.products); 

Như bạn thấy, metamodel tránh việc sử dụng các chuỗi, vv tránh được nhiều lỗi thời gian chạy. Nếu anyway bạn không sử dụng metamodel, hãy thử này:

SetJoin<Company,Product> products = companyRoot.join("products"); 

Nếu bây giờ bạn muốn thêm một predicate, tức là một cái gì đó sau khi where, bạn sẽ viết một cái gì đó như:

Predicate predicate = criteriaBuilder.equal(products.get(Product_.category), "dentist"); 
criteria.where(predicate); 

Nếu bạn muốn thêm một số join cho pháp nhân Thành phố:

Join<Company, City> city = companyRoot.join(Company_.city); 
predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(city.get(City_.cityName), "Leeds"); 
criteria.where(predicate); 

(giả sử tên thành phố là tên trường chính xác cho thành phố của bạn).

Các vấn đề liên quan