2013-01-15 32 views
0

我試圖使用JPA Criteria Builder來連接兩個表CountryGeotarget。 等效SQL使用JPA Criteria Builder與表連接

Select distinct Country.* from Country Inner Join Geotarget 
where Geotarget.Country_ID = Country.ID; 

我的代碼是

 CriteriaBuilder criteriaBuilder getTransactionalEntityManager().getCriteriaBuilder(); 
    CriteriaQuery<Country> criteriaQuery = criteriaBuilder.createQuery(Country.class); 
    Root<Country> root = criteriaQuery.from(Country.class); 
    Join<Geotarget, Country> geotargetJoin = root.join(Geotarget_.country, JoinType.INNER); 
    Predicate predicate = criteriaBuilder.equal(Country_.id,Geotarget_.country); 
    criteriaQuery = criteriaQuery.where(predicate); 
    criteriaQuery.select(Country.class).distinct(true); 
    return findAllObjects(criteriaQuery); 

不過是錯誤的,它甚至沒有在地方解析。特別是我似乎無法找到連接線的代碼,或者似乎不喜歡比較兩個字段的等號原因。 你能以正確的代碼幫助我嗎?

+0

顯示每個實體相關屬性的定義。 – perissf

回答

1

我不認爲你需要謂詞。連接本身應該執行GeoTarget.Country_ID = Country.ID。修改爲:

CriteriaBuilder criteriaBuilder getTransactionalEntityManager().getCriteriaBuilder(); 
CriteriaQuery<Country> criteriaQuery = criteriaBuilder.createQuery(Country.class); 
Root<Country> root = criteriaQuery.from(Country.class); 
Join<Geotarget, Country> geotargetJoin = root.join(Geotarget_.country); // Default is inner 
criteriaQuery.select(Country.class).distinct(true); 
return findAllObjects(criteriaQuery);