2014-10-16 41 views
0

我已經找到了一個代碼庫下面的模式,通過JPA將EclipseLink:這是一個關於EclipseLink使用情況的好模式嗎?

TypedQuery query = ... 
... 
if(query.getResultList().size() > 0) { 
    return query.getSingleResult(); 
} else { 
    return null; 
} 

丟棄約weither或沒有返回null是一個好主意的問題,我更想知道的事實是,雖然兩查詢在代碼中是連續的,在負載較重的情況下(這是本項目的預期),查詢可能會針對數據庫觸發兩次,而不是使用緩存。

我錯了嗎?我可以安全地假設第二個調用將總是碰到緩存,或者是否應該修改這種模式以便捕獲NoResultException?

+0

爲什麼不只是執行一次查詢,然後從列表中返回第一個值?緩存可能會阻止重建實體,但執行查詢兩次是不必要的,根據查詢和您的選項,將會轉到數據庫。 – Chris 2014-10-16 13:06:54

+0

好吧,這種模式可能會拋出一個NonUniqueResultException,而抓住第一個結果不會,你必須自己去做。我並不是說這是一個糟糕的主意,我只是說我寧願明確地抓住NoResultException,而不是做這個雙重調用。 – gizmo 2014-10-16 13:09:59

回答

1

不,這不是一個好的模式。您不必要地執行查詢兩次,因此取決於其他設置,以防止查詢觸及可能已經配置或可能未配置的數據庫-EclipseLink具有查詢緩存,但默認情況下它未啓用,您實際上不需要在這裏使用它。如果您尚未配置查詢緩存,則實體將從第一個查詢緩存,因此您正在將多個實體讀入內存,然後再次訪問數據庫以獲取其中一個實體。

的常見模式是隻是爲了檢查列表,並返回的第一個值:

List values = query.getResultList(); 
if(values.size() > 0) { 
    return values.get(0); 
} else { 
    return null; 
} 

如果該查詢可以返回大量的實體,您也可能稱query.setMaxResults(1);限制返回的結果。

相關問題