Как использовать 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 является правильным именем поля для вашего города).