SqlSugar 和 Oracle 结合在一起 ORA-00972 标识符过长

发布时间 2023-06-05 15:17:10作者: 兴想事成

1.声明: 本人是 SqlSugar  忠实的粉丝;

2.有些坑跟Oracle 脱不开关系;

3.解决方案,肯定是有的,而且不止一种;

 

先讲述一下, 这个坑是怎么出来的. 

一般,我本人使用联表查询(比如 A,B), 结果集 都是单独建一个 Vo, 然后用 SelectAll()  映射,一步到位.

同事有点想偷懒, 这样整.

public class A 

{

   public string 字段1;

   public string 字段2;

   public B  ItemB;

}

其中A,B 各表都有很多字段.

于是现在查询 为 

db.Queryable<A>() .LeftJoin<B>((a, b) => a.id== b.id).Select((a, b) => new A{ id= a.id.SelectAll(),ItemB=b}

这时报了一个错:  ORA-00972 标识符过长, 查了下,  定位问题为:  别名超过30个字符.

什么意思呢, 就是  SqlSugar   生成出来的 sql为 

SELECT a.*, "B"."DBID" AS "B.NOTICE_TODO_ITEM.DBID" , "B"."IDX" AS "B.NOTICE_TODO_ITEM.IDX" ,
"B"."CREATE_TIME" AS "B.NOTICE_TODO_ITEM.CREATE_TIME" , "B"."RUN_ACTION_TOTAL" AS "B.NOTICE_TODO_ITEM.RUN_ACTION_TOTAL" ,
"B"."RUN_ACTION_NEED" AS "B.NOTICE_TODO_ITEM.RUN_ACTION_NEED" ,
"B"."TITLE" AS "B.NOTICE_TODO_ITEM.TITLE" FROM "NOTICE_TODO_ITEM_RUN" a
Left JOIN "NOTICE_TODO_ITEM" b ON ( "A"."ITEM_DBID" = "B"."DBID" ) ORDER BY "A"."CREATE_TIME" DESC

 

其中 "B"."RUN_ACTION_TOTAL" AS "B.NOTICE_TODO_ITEM.RUN_ACTION_TOTAL"  别名 长度唱过30个字符,oracle 不支持.

 

那现在就找解决办法:

1.该表,改字段, 让 表  和 字段 长度进行缩减;

   ==> 如果是新表,可以这样做,但如果是 已经上线的表,这样操作不太合适.

2.所有与B表相关的字段, 都全部列举,不用 简写的方式

比如 :

db.Queryable<A>() .LeftJoin<B>((a, b) => a.id== b.id).Select((a, b) => new A{ id= a.id.SelectAll(),ItemB=new B{ IDX=b.IDX, CREATE_TIME=b.CREATE_TIME... }}

这样如果B表字段太多,写起来有点小麻烦.

 

3. 既然是别名长度超过30个字符,那就想办法缩减别名

 

比如定义

  public int? RUN_ACTION_TOTAL{ get; set; } 改为 如下这种写法

 [SugarColumn(ColumnName = "RUN_ACTION_TOTAL")]

public int? TOTAL { get; set; }

 

生成的 sql为 B.NOTICE_TODO_ITEM.TOTAL 这样 一定程度上 满足了 30个字符的要求.

 

但是 如果真的有那种表名特别长的, 比如  >=27个长度的, B.[27].  这就30个字符了,后面完全没有改字段的余地了.

  所以如果项目没上线, 最好还是修改表名和字段名, 尽量简短.(写好注释和文档即可)