java:使用JPA接收对象列表时的ClassCastException

时间:2018-04-09 07:01:09

标签: java list jpa

我试图接收Tempfiles类型的对象列表,我不知道在获取它的方式出了什么问题。当我收到列表时,列表的大小不为零,但是当我尝试使用它时,我得到了ClassCastException: 这是班级Tempfiles的极点:

@Entity
@Table(name="tempfiles")
@NamedQuery(name="Tempfile.findAll", query="SELECT t FROM Tempfile t")
public class Tempfile implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer tempfilesid;

    private byte[] filestream;

    //bi-directional many-to-one association to Filemetadata
    @ManyToOne
    @JoinColumn(name="documentid")
    private Filemetadata filemetadata;

    public Tempfile() {
    }

    public Integer getTempfilesid() {
        return this.tempfilesid;
    }

    public void setTempfilesid(Integer tempfilesid) {
        this.tempfilesid = tempfilesid;
    }

    public byte[] getFilestream() {
        return this.filestream;
    }

    public void setFilestream(byte[] filestream) {
        this.filestream = filestream;
    }

    public Filemetadata getFilemetadata() {
        return this.filemetadata;
    }

    public void setFilemetadata(Filemetadata filemetadata) {
        this.filemetadata = filemetadata;
    }
}

这是我用来的方法:

public List getTempFileData()
    {
        String METHOD_NAME = "getTempFileData";
        logger.logEntering(METHOD_NAME);
        String strQueryToGetStream = "select t.tempfilesid, t.filemetadata.documentid, t.filestream from Tempfile t";
        logger.logInfo(strQueryToGetStream);
        Query query = entityManager.createQuery(strQueryToGetStream);
        List <Tempfile>tempFileList = query.getResultList();
        logger.logExiting(METHOD_NAME);
        return tempFileList;
    }

以下是我收到它的方式:

List <Tempfile>tempFileList = fileDao.getTempFileData();

当我在循环中使用列表时,我得到了异常:

for(Tempfile tempFile : tempFileList)
{
    decryptAndEncryptStream(tempFile, job, publicKey);
}

这是我得到的例外:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.global.empris.domain.Tempfile

非常感谢您的帮助和提前感谢。

3 个答案:

答案 0 :(得分:1)

您的查询返回的是Object[]而非TempFile的列表。您只选择特定列,因此不会映射到完整对象。

像对待结果集一样处理每个Object[],或更改查询以选择完整对象(即SELECT t FROM Tempfile t)。

答案 1 :(得分:0)

IMO,您从JPA获取了一系列对象,因为您只选择了实体的一部分。如果你想要你的实体,选择它并像这样获取它的子集合

select t from Tempfile t left join fetch t.filestream

答案 2 :(得分:0)

语句List <Tempfile>tempFileList = query.getResultList();返回List<Object>。你应该Transformers.aliasToBean(TempFile.class)