You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OrmLite中如何映射Blob数据类型?关联查询结果映射求助

嘿,我来帮你搞定这两个OrmLite的问题!

OrmLite中Blob数据类型的映射方法

OrmLite对Blob类型的映射其实挺直观的,主要分两种场景,看你的二进制数据大小来选:

  • 小体积二进制数据(比如图标、小文件):直接用byte[]类型定义实体字段,配合@DatabaseField注解指定dataType为DataType.BYTE_ARRAY。OrmLite会自动把这个字段映射到数据库的Blob类型,读写时自动转换:

    public class Equipo {
        // 其他字段...
        @DatabaseField(dataType = DataType.BYTE_ARRAY)
        private byte[] blobField; // 对应数据库的Blob字段
    
        // getter和setter...
    }
    
  • 大体积二进制数据(比如大文件):如果数据量很大,用byte[]容易占满内存,可以用InputStream类型,注解指定dataType为DataType.BLOB,这样可以流式处理数据,避免内存过载:

    public class Equipo {
        // 其他字段...
        @DatabaseField(dataType = DataType.BLOB)
        private InputStream blobStream;
    
        // getter和setter...
    }
    
关联查询的结果映射修正

你现在的代码有两个明显的问题:一是mapRow里的return语句语法完全错误,二是直接拼接idUsuario会有SQL注入风险,另外Blob字段的转换也需要处理。我给你修正后的版本:

GenericRawResults<Equipo> rawResults = dao.queryRaw( 
    // 用占位符?代替直接拼接参数,避免SQL注入
    "SELECT e.* from equipo e " + 
    "INNER JOIN equipousuario eu " + 
    "ON eu.id_equipo = e.id " + 
    "WHERE eu.id_usuario = ? ", 
    new RawRowMapper<Equipo>() { 
        @Override
        public Equipo mapRow(String[] columnNames, String[] resultColumns) { 
            // 创建Equipo实例,逐个赋值字段
            Equipo equipo = new Equipo();
            // 这里的索引要和你SELECT语句返回的列顺序完全对应
            // 假设equipo表的列顺序是:id, col1, col2, blob_field, col4, col5...
            equipo.setId(Integer.parseInt(resultColumns[0]));
            equipo.setCol1(resultColumns[1]);
            equipo.setCol2(resultColumns[2]);
            
            // 处理Blob字段:queryRaw返回的Blob是Base64编码的字符串,需要解码成byte[]
            if (resultColumns[3] != null) {
                byte[] blobData = Base64.getDecoder().decode(resultColumns[3]);
                equipo.setBlobField(blobData);
            }
            
            // 其他字段继续赋值,比如你原来代码里的resultColumns[4]、[5]
            equipo.setCol4(Integer.parseInt(resultColumns[4]));
            equipo.setCol5(resultColumns[5]);
            
            return equipo;
        } 
    },
    idUsuario // 把参数传递给占位符,安全又规范
);

几个关键提醒:

  • 一定要用占位符?传递参数,别直接拼接字符串,不然很容易被SQL注入攻击;
  • resultColumns的索引必须和SELECT语句返回的列顺序完全匹配,你要根据自己的表结构调整索引位置;
  • Blob字段在queryRaw的结果中是Base64编码的字符串,所以需要用Base64工具类解码成byte[](Java 8+自带java.util.Base64)。

内容的提问来源于stack exchange,提问作者mrv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:12