SqlSugar 和 Oracle 結合在一起 ORA-00972 標識符過長

1.聲明: 本人是 SqlSugar  忠實的粉絲;

2.有些坑跟Oracle 脫不開關係;

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

 

先講述一下, 這個坑是怎麼出來的. 

一般,我本人使用聯表查詢(比如 A,B), 結果集 都是單獨建一個 Vo, 然後用 SelectAll()  映射,一步到位.

(A表 全名: NOTICE_TODO_ITEM_RUN 

B表 全名 :NOTICE_TODO_ITEM  ,部分字段 DBID,IDX, RUN_ACTION_TOTAL,RUN_ACTION_NEED)

同事有點想偷懶, 這樣整.

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個字符了,後面完全沒有改字段的餘地了.

  所以如果項目沒上線, 最好還是修改表名和字段名, 儘量簡短.(寫好註釋和文檔即可)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章