2013-06-05 44 views
0

我正在使用play框架創建REST API。我想使用延遲加載(finder.ref(id)或Ebean.getReference(id))來查看數據庫中是否存在具有特定標識的枚舉。如果它不存在,我將返回一個404.Ebean延遲加載以查看資源是否存在

如果我嘗試使用不存在的ID進行刪除,則會拋出OptimisticLockException。但是,這似乎不是一個有效的基礎,看看一個實體是否存在。

是否有可能通過使用延遲加載來檢查實體是否存在ID?我總是可以做finder.byId(id),這可以讓我得到我想要的。但我想要有效地做到這一點。

感謝

回答

1

您可以僅計算項目與指定id,而你的id是獨一無二的,它會如果項目存在返回1和0,如果沒有,那麼你可以很容易地使一個條件:

boolean itemExists 
     = (YourModel.find.where().eq("id", id).findRowCount() == 1) ? true : false; 

Logger.info("Item " + ((itemExists) ? "exists" : "not found!")); 

在,如果你的內涵爲以JSON的例子返回現有實體另一方面,則不需要進行單獨檢查,只檢查,如果它不是空...

YourModel entity = YourModel.find.byId(id); 
if (entity == null) return notFound("No such record"); 

// .. rest of code for preparing API... 

編輯

關於費用:find.byId(id)試圖獲取整個實體,而find.ref(id)得到僅供參考。不幸的是,您不能確定對象是否存在ref(id),因爲它總是不爲空,因此,按照id計算元素的IMHO比選擇偶數單個字段檢查Db是否返回實體要便宜。

其實find.byId(id)是最昂貴的選擇,因爲它加載整個實體,以及優化的API通常最好使用Ebean的select()fetch(),喜歡寫專門的方法:

YourModel e = YourModel.find.select("id, name, age").where().eq("id", id).findUnique(); 

List<YourModel> le = YourModel.find.select("id, name, age").where().eq("id", id).findList(); 
+0

我想要看看是否有一種方法可以使用延遲加載來實現,通過獲取引用而不是整個對象。也許我正在試圖做不必要的優化。我甚至不知道調用的成本是多少(find.ref(id)vs find.byId(id))。 – user724535

+0

我想第一個選項會起作用。我正在使用它來刪除,所以我不需要json。只是想知道該項目是否存在並且已被刪除。 – user724535