我處於我們公司具有高度可配置的數據庫搜索服務的位置,對於此類服務,以編程方式配置查詢非常有用。 Criteria API功能強大,但是當我們的開發人員重構其中一個數據對象時,條件限制不會表示它們在我們運行單元測試之前已經損壞,或者更糟糕的是,它們在我們的生產環境中正常運行。最近,由於這個問題,我們有一個重構項目出乎意料地在工作時間翻了一番,項目規劃中存在一個缺口,如果我們知道需要多長時間,我們可能會採取另一種方法。如何克服Hibernate標準和示例API的侷限性?
我想使用示例API來解決此問題。如果我們在真正的POJO屬性中指定'where'條件,那麼Java編譯器可以大聲表明我們的查詢是borked的。但是,Example API中只有很多功能,並且在很多方面都受到限制。看看下面的例子
Product product = new Product();
product.setName("P%");
Example prdExample = Example.create(product);
prdExample.excludeProperty("price");
prdExample.enableLike();
prdExample.ignoreCase();
在這裏,「名稱」屬性被查詢反對(其中名稱像「P%」),如果我是刪除或重命名字段「名」,我們會立即知道。但是,財產「價格」呢?它被排除了,因爲Product對象有一些默認值,所以我們將「price」屬性名稱傳遞給排除過濾器。現在,如果「價格」被刪除,這個查詢在語法上是無效的,並且直到運行時纔會知道。瘸。
另一個問題 - 如果我們添加了什麼第二where子句:
product.setPromo("Discounts up to 10%");
因爲調用enableLike()的,這個例子將匹配的宣傳文字「折扣高達10%」,但也「折扣高達1000萬美元」或其他任何匹配。通常,Example對象的查詢範圍修改(如enableLike()或ignoreCase())並不總是適用於每個正在檢查的屬性。
這是第三個主要問題 - 其他特殊標準呢?使用標準示例框架無法獲得價格高於10美元的每件產品。無法通過促銷,降序來訂購結果。如果產品對象加入某個製造商,則無法在相關的製造商對象上添加條件。沒有辦法在製造商的標準上安全地指定FetchMode(雖然這是一般的Criteria API的問題 - 無效提取的關係失敗,甚至更多的定時炸彈)
對於所有上述示例,您需要返回Criteria API並使用屬性的字符串表示形式進行查詢 - 同樣,消除了示例查詢的最大好處。
示例API還有什麼替代方法可以獲得我們需要的編譯時建議?
這是非常有趣的東西,但stackoverflow不是一個論壇,你不會在這裏得到反饋,你的問題可能會被關閉在當前的形式。正如常見問題解答中所述,「只要您假裝自己處於危險境地:提問並回答自己的問題也是完全正確的:以問題的形式表述它」*。我建議改寫它,並將細節作爲答案發布。 – 2010-09-10 17:53:08
@Pascal謝謝,我會繼續並重新編制問題 – 2010-09-10 18:46:25
不客氣。並感謝張貼這個。 – 2010-09-11 03:17:21