选择具有特定属性的实体时出现ClassCastException

时间:2011-03-29 23:48:56

标签: java jpa

我想选择具有特定属性的实体。检索整个实体不是一种选择,因为file属性返回byte[]会降低应用程序的速度。但是它会抛出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;
    }
}

2 个答案:

答案 0 :(得分:5)

您获得ClassCastException的原因是您的getAllGarbage查询不返回Garbage实例的集合。编写查询以专门返回与Garbage实例关联的值的子集,而不是完整的Garbage对象。如果调试方法,您可能会注意到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实例,允许原始代码按预期执行。

另外,我建议不要像在示例代码中那样对每次访问Garbage实例执行类转换。这种技术为应用程序增加了不必要的开销,并使代码更难以长期维护。如果要多次使用已转换对象,请创建一个变量来存储已转换的实例并重复使用它。

答案 1 :(得分:1)

如果您使文件信息变得懒惰,那么它不会减慢应用程序的速度。当您有一个包含大数据的字段(或多个字段)时,这是一种常见的策略。