Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错

方法一

原代码

复制代码
sql +=" and FIND_IN_SET(s.M_ID,'" + ids + "')";
修改为 sql += " where s.M_ID"+getInSql(ids);
复制代码
public static String getInSql(String ids) {
    String[] idArray = ids.split(",");
    StringBuilder sql = new StringBuilder(" IN (");
    for (int i = 0; i < idArray.length; i++) {
        // 直接将参数值添加到 SQL 片段中
        sql.append("'").append(idArray[i].trim()).append("'");
        if (i < idArray.length - 1) {
            sql.append(",");
        }
    }
    sql.append(")");
    return sql.toString();
}

缺点,FIND_IN_SET量大,需要改动多

方案二观察到Jfinal所有需要执行的sql语句会经过Sqlite3Dialect,我们在Sqlite3Dialect类中重写sql语句,判断是sqlite数据库,且是否含FIND_IN_SET,继而进行修改替换FIND_IN_SET

复制代码
@Override
public List<Record> dbFindForRecord(String sql, Object... paras) {
   /*System.out.println(sql);
   List<Record> list = Db.find(sql,paras);
   return list;*/
   String jdbcUrl = null;
   try {
      jdbcUrl = DbKit.getConfig().getDataSource().getConnection().getMetaData().getURL();
   } catch (SQLException e) {
      e.printStackTrace();
   }
   System.out.println("改动之前sql"+sql);
   if (jdbcUrl != null && jdbcUrl.contains("sqlite") && sql.contains("FIND_IN_SET")) {
      // 正则:FIND_IN_SET(\w+,\?(\d+)?\))  ->  INSTR(','||$2||',' , ','||$1||',')>0
      sql = sql.replaceAll("(?i)FIND_IN_SET\\s*\\(\\s*(\\w+)\\s*,\\s*\\?\\s*\\)",
            "INSTR(','||?||',' , ','||$1||',')>0");
   }
   System.out.println("改动之后sql"+sql);
   return Db.find(sql, paras);

},其他调用可按如上例子修改,看自己需求
相关推荐
博一波4 分钟前
Redis 集群:连锁银行的 “多网点智能协作系统”
数据库·redis·缓存
HashData酷克数据10 分钟前
官宣:Apache Cloudberry (Incubating) 2.0.0 发布!
数据库·开源·apache·cloudberry
秋难降11 分钟前
SQL 索引突然 “罢工”?快来看看为什么
数据库·后端·sql
TDengine (老段)40 分钟前
TDengine 时间函数 TODAY() 用户手册
大数据·数据库·物联网·oracle·时序数据库·tdengine·涛思数据
码界奇点1 小时前
KingbaseES一体化架构与多层防护体系如何保障企业级数据库的持续稳定与弹性扩展
数据库·架构·可用性测试
悟乙己1 小时前
数据科学家如何更好地展示自己的能力
大数据·数据库·数据科学家
皆过客,揽星河2 小时前
mysql进阶语法(视图)
数据库·sql·mysql·mysql基础语法·mysql进阶语法·视图创建修改删除
tuokuac2 小时前
Redis 的相关文件作用
数据库·redis·缓存
鹧鸪云光伏与储能软件开发3 小时前
投资储能项目能赚多少钱?小程序帮你测算
运维·数据库·小程序·光伏·光伏设计软件·光伏设计
2301_779503765 小时前
MySQL主从同步--主从复制进阶
数据库·mysql