我想从数据库中读取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[]>
。我究竟做错了什么?请帮我解决我的问题。
答案 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]
。