2012-01-26 11 views
10

これはこれにさらに質問です参加するときJPA基準のAPIを使用する方法:多くのテーブル

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")); 

会社は、アドレス内の市、POJOや各国のアドレスがありましたがポホ。 JOINでどのように使用できますか?私はaddress.cityでそれを参照しようとしましたが、私はエラーメッセージが表示されました:

マネージ型 [EntityTypeImpl 1692700229 @から属性[address.city]:会社[のJavaType:クラス com.test.domain.Company記述子: RelationalDescriptor(com.test.domain.Company-> [DatabaseTable(COMPANY)])、マッピング:16]]が存在しません。

答えて

19

標準Metamodelを使用している場合、この種のエラーは発生しません。 あなたのコードでは、 "歯科医"は会社のエンティティのフィールドではないので、おそらくあなたのエラーの原因となる "歯科医"キーワードを誤用しています。

joinはメタモデルを使用していることを定義する方法はこれですしかし、あなたが他の質問であなたのクラスを定義した方法を見て、:あなたが見ることができるように

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

、メタモデルは、文字列の使用を避ける、など多くの実行時エラーを回避します。とにかくあなたは、メタモデルを使用しない場合は、これを試してみてください。

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

あなたが今where後に何かをpredicate、すなわち追加したい場合は、あなたが何か書きます:

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はあなたの街の正しいフィールド名であると仮定)。

関連する問題