Как использовать API критериев JPA при объединении многих таблиц

это еще один вопрос к этому:

как использовать API критериев JPA в 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"));

компания имеет адрес, внутри адреса есть город-pojo и страна-Pojo. Как я могу использовать его в JOIN? Я попытался сослаться на address.city но я получил сообщение об ошибке:

атрибут [адреса.city] из управляемого типа [EntityTypeImpl@1692700229:Company [ javaType: класс com.тест.домен.Дескриптор компании: RelationalDescriptor (com.тест.домен.Компания>-- [DatabaseTable (COMPANY)]), сопоставления: 16]] отсутствует.

1 ответов


если вы используете canonical Метамодель, вы будете избегать такого рода ошибок. В вашем коде вы неправильно использовали ключевое слово "dentist", что, вероятно, является причиной вашей ошибки, потому что" dentist " не является полем в сущности компании.

однако, глядя на то, как вы определили свой класс в другом вопросе, способ определить это join использование метамодели таково:

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

как вы можете видеть, Metamodel избегает использования строк, и поэтому избегает много времени выполнения ошибки. Если вы все равно не используете Метамодель, попробуйте следующее:

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

если вы теперь хотите добавить predicate, то есть что-то после where, вы напишете что-то вроде:

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

если вы хотите добавить join для городского образования:

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

(предположим, что поле cityName является правильным именем поля для вашего города).