2011-03-29 6 views
0

특정 속성을 가진 엔티티를 선택하려고합니다. 응용 프로그램의 속도를 느리게하는 byte[]을 반환하는 file 특성 때문에 전체 엔터티를 검색하는 것은 옵션이 아닙니다. 그러나 그것은 ClassCastException을 던졌습니다. 여기ClassCastException 특정 속성을 가진 엔티티를 선택할 때

@NamedQuery(name = "findAllGarbage", query = "SELECT g.filename, g.description, g.uploadDate FROM Garbage g;") 
@Entity 
public class Garbage { 

@Id 
@GeneratedValue 
@Column(nullable = false) 
private Long id; 
@Column(nullable = false) 
private String filename; 
@Column(nullable = false) 
private String fileType; 
@Column(nullable = false) 
private String uploadDate; 
@Column(nullable = false) 
private String destroyDate; 
@Lob 
@Column(nullable = false) 
private byte[] file; 
@Column(nullable = false) 
private String description; 
    //Getters and Setters... 

데이터 액세스를위한 EJB이다 : 여기

엔티티이다. 메서드 findAllGarbage()ClassCastException을 트리거하는 메서드입니다.

@Stateless(name = "ejbs/SearchEJB") 
public class SearchEJB implements ISearchEJB { 


@PersistenceContext 
    private EntityManager em; 

    public List<Garbage> findAllGarbage() { 
     Query query = em.createNamedQuery("findAllGarbage"); 

     List<Garbage> gList = new ArrayList(); 

     for (Object o : query.getResultList()) { 

      Garbage tmpG = new Garbage(); 
      tmpG.setFilename(((Garbage) o).getFilename()); 
      tmpG.setUploadDate(((Garbage) o).getUploadDate()); 
      tmpG.setDescription(((Garbage) o).getDescription()); 

      gList.add(tmpG); 
     } 
     return gList; 
    } 
} 

답변

5

당신이 ClassCastException를 얻고있는 이유는 getAllGarbage 쿼리 쓰레기 인스턴스의 컬렉션을 반환하지 않는다는 것입니다. 이 쿼리는 전체 가비지 개체가 아닌 가비지 인스턴스와 관련된 값의 하위 집합을 반환하도록 작성되었습니다. 메소드를 디버그하면 query.getResultsList()가 Object []의 콜렉션을 리턴하는 것을 알 수 있습니다. Object []는 명명 된 쿼리에 지정된 값 (파일 이름, 설명 및 업로드 날짜)과 일치해야합니다.

다음은 작동해야하는 결과 사용의 예입니다.

for (Object o : query.getResultList()) { 
    Object[] cols = (Object[]) o; 
    Garbage tmpG = new Garbage(); 
    tmpG.setFilename(cols[0]); 
    tmpG.setDescription(cols[1]); 
    tmpG.setUploadDate(cols[2]); 

    gList.add(tmpG); 
} 

대안은 예상대로 원래의 코드를 실행할 수 있도록 반환되는 전체 쓰레기 인스턴스가 발생합니다

select g from Garbage g 

에 기본 쿼리를 변경하는 것입니다.

예제 코드에서 수행하는 것처럼 Garbage 인스턴스에 대한 모든 액세스에 대해 클래스 캐스트를 수행하지 말 것을 권장합니다. 이 기술은 응용 프로그램에 불필요한 오버 헤드를 추가하고 코드를 장기적으로 유지 관리하기 어렵게 만듭니다. 형변환 된 오브젝트를 두 번 이상 사용하려면, 형 변환 된 인스턴스를 저장하고 다시 사용하기위한 변수를 작성하십시오.

+0

대안 (나는 또한 btw를 선호한다)에 관해서는, OP는 이것이 어떻게 든 옵션이 아니라고 언급했다. 관련 질문 + 답변을 참조하라 : http://stackoverflow.com/questions/5460476/issue-rendering- jpf-custom-query-results-into-a-jsf-page – BalusC

+0

for 루프는 클래스 캐스트 예외를 수정했습니다. 고맙습니다. 그러나 sortBy 함수는 작동하지 않습니다. – sfrj

1

파일 정보를 게으르게 만들면 응용 프로그램의 속도가 저하되지 않습니다. 이는 대용량 데이터가 포함 된 필드 (들)가있을 때 일반적인 전략입니다.

+0

내 엔티티에서 단지 하나의 속성 만 lazy로 만들 수 있습니까? 그게 좋은 생각일까요? – sfrj

+0

@sfrj - Lob 주석에 대한 문서를 체크 아웃하면이 정확한 상황이 표시됩니다 (Lobs의 경우 매우 일반적이므로). http://download.oracle.com/javaee/5/api/javax/persistence/Lob.html – jtahlborn

관련 문제