2014-10-01 48 views
0

我有一個名爲用戶的實體,它具有以下關係的實體,稱爲公司:JPA標準 - 基於數據庫字段名錶述

@Entity 
public class User { 
... 
@ManyToOne 
@JoinColumn(name="COMPANY_ID",referencedColumnName="ID") 
private Company company = null; 
... 
} 

而且在我的數據庫,我有一個用戶表一中「 COMPANY_ID「欄。如何使用此字段創建JPA標準查詢?

使用標準的建設者,我已經試過以下表達式沒有成功:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery cq = cb.createQuery(User.class); 
Root mockEntityRoot = cq.from(User.class); 

//cq.where(cb.equal(mockEntityRoot.get("company"), 2)); 
//cq.where(cb.equal(mockEntityRoot.get("COMPANY_ID"), 12)); 
cq.where(cb.equal(mockEntityRoot.get("company.id"), 8)); 

entityManager.createQuery(cq).getResultList(); 

但我得到了以下錯誤:「屬性[company.id]從管理型用戶不存在。 「

在此先感謝。

回答

1

我想你需要一個明確的連接。

注意我正在使用Criteria的元模型。

這是一個片段我,這不是同樣的事情,你的,但你可以有一個想法

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Site> q = cb.createQuery(Site.class); 
    Root<Site> e = q.from(Site.class); 
    Join<Site,SiteType> siteType = e.join(Site_.siteType); 

    Predicate predicate = cb.conjunction(); 
    Predicate p1 = cb.equal(siteType.get(SiteType_.id), selectedSiteType.getId()); 
    Predicate p2 = cb.equal(e.get(Site_.markedAsDeleted), false); 
    predicate = cb.and(p1,p2); 

    q.where(predicate);  
    q.select(e); 

    TypedQuery<Site> tq = entityManager.createQuery(q); 
    List<Site> all = tq.getResultList(); 

    return all; 
+1

嗨獅子座,非常感謝的提示答案。我使用以下謂詞測試了您的方法: '加入<用戶,公司> userCompanyJoin = mockEntityRoot.join(「company」); (cb.equal(userCompanyJoin.get(「id」),exampleObject.getCompany()。getId()));'和它的工作原理! (cb.equal(mockEntityRoot.get(「company」).get(「id」),exampleObject.getCompany()。getId()));'並且這有相同的成功行爲。 再次感謝您的幫助。 – rbezerra 2014-10-01 14:11:23