2012-02-06 100 views
3

我有一個hibernate和jpa很奇怪的問題。下面是兩個代碼塊:當query.getSingleResult()直接返回時,JPA返回null

public Object getObject(Date date) { 
    try { 

     Query query = entityManager 
       .createQuery(
         "select ob from Object ob where date= :date"); 
     query.setParameter("date", date); 

     return (Object)query.getSingleResult(); 

    } catch (EmptyResultDataAccessException e) { 
     logger.debug(String.format("No Result found - date[%s]",date)); 
     return null; 
    } 
} 

...

public Object getObject(Date date) { 
    try { 

     Query query = entityManager 
       .createQuery(
         "select ob from Object ob where date= :date"); 
     query.setParameter("date", date); 

     Object ret = (Object)query.getSingleResult(); 
     return ret; 


    } catch (EmptyResultDataAccessException e) { 
     logger.debug(String.format("No Result found - date[%s]",date)); 
     return null; 
    } 
} 

首先生成一個EmptyResultDataAccessException每次連給出的日期匹配,其中一個有效的記錄。第二個按預期返回結果。有沒有人遇到過這個?什麼導致這種行爲?

請假定存在所有其他合成事物(事務,初始化實體管理器等),唯一改變的是查詢結果是直接在返回中檢索還是首先分配給變量。

+0

可能是我的問題可能是無益的,但是,你真的確定這兩個請求是相同的嗎?請執行一個簡單的複製/粘貼,然後重新測試,我很確定你的陳述是正確的。 – Zakaria 2012-02-06 20:45:39

+0

我正和幾位同事坐在一起,我們一直在編輯和重新部署這個罐子,只做了一次改變。它真的很奇怪。我不斷從這個方法得到空回報。我在太陽下試過所有的東西,直到我把這個'getSingleResult()'調用到一個任務開始意外工作的任務中。 – nsfyn55 2012-02-06 20:52:45

+0

例外看起來如何? (stacktrace) – Bozho 2012-02-06 21:00:10

回答

0

這是不可能的。這兩個變體是相同的。也許你錯過了一些東西。

請注意,如果結果超過1個,則getSingleResult()可能會引發異常。

+0

我會傾向於同意你的看法。我完全接受建議。 – nsfyn55 2012-02-06 20:46:30

+0

我的猜測是你沒有運行你認爲你的代碼(沒有正確編譯/部署它/在類路徑中有兩次),或者你沒有訪問你認爲你的數據(每個訪問不同的數據庫或在不同的事務) – James 2013-09-16 14:18:11

1

IS可能的,我也遇到過它。我認爲這與Hibernate正在做的字節碼操作有關。爲了找到它的根源,你必須進行深入而深入的實施。

使用Hibernate/JPA時,我總是使用第二種模式。這很不幸,因爲它使得代碼更加冗長,但不值得陷入生成的字節碼的深度並試圖理解它。

+0

無論hibernate做什麼,都停留在Query對象中,可能還有實體。我敢打賭編譯器爲這兩個版本產生相同的輸出 – Bozho 2012-02-06 20:48:25

+0

在Hibernate的** run-time **中有很多字節代碼操作來支持延遲加載和其他概念。一旦代碼在這樣的級別上被操縱,幾乎不可能應用關於代碼行爲的靜態推理。 – 2012-02-06 20:51:42

+0

hibernate做的是實體子類的代碼生成,但這與調用「Query」對象無關。 – Bozho 2012-02-06 20:57:48

相關問題