2012-08-10 69 views
0

我可以知道什麼是檢索實體屬性名稱檢索實體的屬性名稱的推薦方法?

例如檢索對象的推薦方式..

Product product = criteria.add(Restrictions.eq("productID",productId)) 
.uniqueResult(); 

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "Fritz%")) 
    .add(Restrictions.between("weight", minWeight, maxWeight)) 
    .list(); 

...

但我不希望給硬編碼「產品ID」或「名稱」或「重量」,推薦的解決方案是什麼?

+0

我不明白你的問題。這種發現方法應該做什麼? – 2012-08-10 07:07:13

+0

使用其ID退回產品?基本上我不想硬編碼「productID」。我只是編輯它,希望現在更清楚 – seesee 2012-08-10 07:08:07

+0

請更改您的問題。我不明白你想說什麼 – Korgen 2012-08-10 07:09:15

回答

2

第一個解決方案:使用常量在一個地方對它們進行硬編碼。這個解決方案雖然很糟糕,因爲你的代碼會變得不太可讀,並且你仍然有可能在你的常量中有不正確的列名。

第二種解決方案:保持原樣並單元測試您的查詢。代碼將保持可讀性,並且您的單元測試將確保您沒有錯誤的名稱。

第三種解決方案:使用JPA API,並使用JPA2標準API與automatically generated metamodel。隨後的查詢將是這樣的:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Order> cq = cb.createQuery(Order.class); 
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items); 
cq.where(cb.equal(itemNode.get(Item_.id), 5)).distinct(true); 

Order_Item_是自動生成分別持有的OrderItem實體的每一列和關聯屬性的元模型類。請注意,恕我直言,JPA2標準API是一種非直觀,難以使用的API,不會使代碼非常易讀。

通過一切手段,每次你可以使用HQL/JPQL而不是標準查詢:他們更可讀恕我直言。當查詢必須基於各種可選標準動態生成時,或者當您有大量複雜的類似查詢並且您可以重用公共部分時,條件查詢很有用。但對於大多數情況,HQL更具可讀性。無論如何,你需要單元測試你的查詢。所以這些測試將檢查屬性名稱是否正確。