2011-08-10 4 views
1

JPQL을 사용하여 데이터베이스를 쿼리하고 있는데 목록을 사용하여 '보고서'테이블 행을 검색 할 수 없습니다.Java : 목록을 사용하여 지속성 쿼리 언어에서 결과 가져 오기

... 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tx = em.getTransaction(); 
tx.begin(); 
Query query = em.createQuery("SELECT r.title, r.company FROM Report as r"); 
    List<Report> itemList = query.getResultList(); 
    for (Report item : itemList) 
    { 
     System.out.println("Item: " + item.getCompany()); 
    } 

출력은 다음과 같습니다 :

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to maps.Report at hello.Test.main(Unknown Source) 

자바 결과 : 1

내가 뭘 잘못이 내 코드의 한 부분인가? 나는 왜 캐스팅을 할 수없는거야?

답변

2

쿼리가 Report의 인스턴스를 선택하지 않습니다. 두 필드를 선택합니다 : r.titler.company. 이 경우 JPA는 Object[]의 목록을 반환합니다. 목록의 각 Object[]에는 제목과 회사의 두 가지 요소가 포함되어 있습니다.

select r from Report r을 사용하여 Report 인스턴스를 선택하십시오.

+0

그래, 많이 고마워! 나는 또한이 [link] (http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/objectstate.html#d0e1152)를 스칼라 결과에 대한 최대 절전 - 엔티티 관리자 문서에서 발견했다. 그들과 거래. 다시 한 번 감사드립니다. – giorgioca

0

TypedQuery를 만들어야합니다.

String sql = "select r from Report r"; 
TypedQuery<Report> query = em.createQuery(sql, Report.class); 
List<Report> reports = query.getResultList(); 
+0

이렇게하면 Hibernate가 선택된 튜플을 마술처럼 변경하여 보고서 인스턴스로 만들지 않습니다. –

+0

OP의 "createQuery"문 다음에 나오는 코드에서 OP가 ** 튜플을 원하지 않는다는 것이 확실합니다. – Jeremy

+0

필자가 중요하게 생각하는 점은 TypedQuery를 만들지 않기 위해 HQL (SQL이 아닌 BTW)을 변경하는 것입니다. 그의 코드는 타입이 지정되지 않은 쿼리에서도 괜찮을 것입니다 (그는 컴파일러 경고 만 받겠습니다). 그리고 그의 HQL 쿼리를 통해 OP가 제목과 회사 필드 만 채워진 보고서 인스턴스를 선택하려고했으나 불가능하다고 생각합니다. –

관련 문제