2014-10-01 2 views
0

나는 엔티티라는 회사에 다음과 같은 관계가 사용자라는 엔티티 있습니다 JPA 기준 - 표현 DB 필드 이름을 기반으로

@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

명시 적 결합이 필요하다고 생각합니다.

주의 기준의 메타 모델을 사용하고 있습니다.

이 그것은, 당신과 같은 일을 내가 가지고있는 코드 조각 아니에요하지만 당신은 아이디어를

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

안녕 레오, 감사 프롬프트 답변을 많이 가질 수 있습니다. 귀하의 접근 방식을 다음과 같은 술어를 사용하여 테스트했습니다 : 'Join userCompanyJoin = mockEntityRoot.join ("company"); cq.where (cb.equal (userCompanyJoin.get ("id"), exampleObject.getCompany(). getId())); 나는 또한 cq.where (cb.equal (mockEntityRoot.get ("company"). get ("id"), exampleObject.getCompany(). getId()));와 같은 성공적인 동작을 보였다 . 다시 귀하의 도움에 감사드립니다. – rbezerra