2011-07-27 3 views
2

나는 이와 같은 쿼리를 가지고 있는데, 어떻게 목록에서 내 엔티티 유형을 얻을 수 있습니까? 그것은 객체와 같이 돌아오고 있지만, 내 엔터티에 던지면 캐스트되지 않습니다.JPA 복수 선택 쿼리

내 테이블 : 또한 B(id_A, id_C) , A(id_A,name,location) C (id_C,......)

 String queryCompany = "select s.name,s.location from B b," + 
       " A s where b.bPK.id_A=s.id_A " + 
       "and b.PK.id_C= :idEvent"; 

     Query queryGetCompany = this.entityManager.createQuery(queryCompany); 
     queryGetCompany.setParameter("idEvent",c.getID()); 

     List companyList = queryGetCompany.getResultList(); 
     //how can I get A.name A.location from this list? 

이 내 쿼리를 할 수있는 좋은 방법입니다?

답변

3

여러 값을 선택하면 목록이 다시 나타납니다. 또한 일반적으로 관계를 통해 이루어 조인

참조, http://en.wikibooks.org/wiki/Java_Persistence/Querying#Query_Results

당신이 객체가 사용하려는 경우,

select s from B b, A s where b.bPK.id_A=s.id_A and b.PK.id_C= :idEvent 

,

select s from A s join s.b b where b.PK.id_C= :idEvent 
3

첫째, 목록의 어떤 종류의 당신의 result "companyList"? 쿼리에서 당신은리스트의 목록을 얻을

companyList.get(i).get(0) // for name 
    companyList.get(i).get(1) // for location 

쉽게 사용하기 위해 당신은 또한 처음에에 좀 더 노력을 모른다고 할 것이다. 그런 다음 실용적이고 객체 지향적 인 구조를 가질 수 있습니다.

select new CompanyDTO (s.name, s.location) 
    from B b, A s 
    where b.bPK.id_A = s.id_A and b.PK.id_C= :idEvent 

이 그럼 당신은 말할 수 : 그럼 당신은 조회에서 말할 수

class CompanyDTO{ 

     public CompanyDTO(String name, String location){ 
     this.name = name; 
     this.location = location; 
     } 

     private String name; 
     private String location; 

     public String getName(){ 
     return this.name; 
     } 
     public String getLocation(){ 
     return this.location; 
     } 
    } 

이 들어

는, 그 클래스처럼 보일 수 있습니다 DTO (데이터 전송 객체)의 종류를 사용합니다 :

List<CompanyDTO> companyList = queryGetCompany.getResultList(); 

나중에는

0 모든 이름과 위치를 얻을 수
for (CompanyDTO company : companyList){ 
     System.out.print(company.getName() + ", "); 
     System.out.println(company.getLocation()); 
    } 

또는 기타 목록 연산. 목록에서 각 DTO를 가져오고이 객체에 대해 get-Methods를 호출 할 수 있습니다.

0

나를 위해 작동합니다.

IIRC를 사용하면 SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....을 수행 할 수 있으며 결과는 List<Object[3]>이며, 배열 내용에 o1,o2,o3 값이 포함됩니다.

public List<Object[]> findXXX(final String param) { 
    final TypedQuery<Object[]> query = this.em.createNamedQuery(
      "package.entity.function", Object[].class); 
    query.setParameter("variable", variable); 

    return query.getResultList(); 
}