團隊升級一次不容易,總要找到足夠的理由或者借口:查詢文法的全面增強;真正徹底的OR映射;效能的提升是三個的主要理由。另外,買一送一的,還有四個暫時不是理由的理由。
查詢文法全面增強
HQL,Native SQL ,Criteria都有大幅增強,不再有太多無法完成需要sql輔助的地方
1.HQL文法增強
使用Antlr的作為文法引擎
支援subquery,distinct, nullif,case ,cast,having count(*)在內的絕大部分SQL文法
支援Bulk-Update,Bulk-Delete 文法
"update Customer set name = :newName where name = :oldName";
2.Native SQL增強
2.0時的Native基本上是流血上市,中看不中用的。3.0時才基本可用。
3. 非完整對象的查詢結果返回Map 而不是Array.
2.0時按array[0],array[1]訪問查詢結果根本是無人敢用的文法,Map的好處是可以按名稱取值
" select new map(goods.goodsNo as goodsNo,goods.code as code) from Goods goods"
Map goods =(Map)list.get(0);
Strng code = (String)goods.get("code");
真正的OR映射
完美支援三種O/R典型映射及其混合
discrim(整個繼承樹在同一個表,通過discrim列區分不同的子類)
unionclass(每個子類一個表,每個表擁有全部屬性)
joinClass(每個父類每個子類各有一個表,父類的屬性在父表,子類的表只包含子類的屬性)
4.discrim支援formula虛擬列做標識符
不再需要一個單獨的discriminator列,可以通過對其他列的計算得出子類的標識符
<discriminator type="int"
formula="CASE WHEN company is null THEN 0 WHEN company = 'JBoss' THEN 1 ELSE 2 END"/>
5.union class支援
<class name="Being" abstract="true">
<id name="id" unsaved-value="0" column="bid">
<generator class="increment"/>
</id>
<property name="identity" column="ident"/>
<union-subclass name="Human" table="aliens">
<property name="sex" column="sex"/>
</union-subclass>
</class>
關鍵效能升級
6.column-level lazy fecth
2.0的時候只能對one to many的列 lazy fecth,結果找一個對象經常藤連瓜瓜連藤找出10來個對象出來,很恐怖。3.0終於沒有這個惡夢了。
買一送一的new feactures
1.EJB3 annotation, 取代xml-base的hbm檔案。
2.Handwrite CRUD SQL, 向ibatis的地盤討飯。
3.持久化XML ,除了POJO外,還支援XML的持久化,方便WebService, ESB類的應用。
4.One Class map to mutible Table,打破 one table,one object的範式。