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個字符了,後面完全沒有改字段的餘地了.
所以如果項目沒上線, 最好還是修改表名和字段名, 儘量簡短.(寫好註釋和文檔即可)