将Object []转换为byte []时出错

时间:2014-12-19 12:18:40

标签: java object casting byte

我想从数据库中读取pdf,其中存储为BLOB,我希望获得List<bytes[]>

session.beginTransaction();
final Criteria criteria = session.createCriteria(MyClass.class);
criteria.add(Restrictions.eq("id",id));
final ProjectionList projectionList = Projections.projectionList().add(
        Projections.property("bdoc"));
criteria.setProjection(projectionList);
List<Object[]> list = criteria.list();
List<byte[]> listBytes = new ArrayList<byte[]>();
for (Object[] item : list) {
    listBytes.add((byte[]) item[0]);
}
session.getTransaction().commit();

但是我在这行for (Object[] item : list) {

中收到错误

[错误] [B无法转换为[Ljava.lang.Object;

我已经调试过了,我确实从数据库中读取了数据:我的List<Object[]> list = criteria.list()不是空的。 但我无法从List<Object[]>转换为List<bytes[]>。我究竟做错了什么?请帮我解决我的问题。

2 个答案:

答案 0 :(得分:3)

B不能转换为[Ljava.lang.Object;

意味着您确实获得了bytearray并且您正在尝试将其转换为Object数组。

答案 1 :(得分:0)

导致此问题的原因是Criteria.list()返回原始List。因此,您可以编写导致ClassCastException的代码。使用正确类型的列表,编译器会阻止这种情况。

正如在其他答案中所解释的那样,文字[B cannot be cast to [Ljava.lang.Object意味着byte[]被投射到Object[],这是不允许的。

这意味着您的列表包含byte[]个对象,您应该将其声明为:

List<byte[]> list = criteria.list();

此外,for-loop的内容现在看起来不正确:

listBytes.add((byte[]) item[0]);

由于item现在是byte[],因此将byte投射到byte[]是不正确的。也许您需要删除数组索引[0]