2014-10-27 62 views
0

如何設置JPQL和/或hibernate以僅從具有複雜網絡嵌套屬性的實體返回可管理數量的數據?具體地,該查詢:由休眠生成的過度詳細的查詢

@Override 
public Patient findPatientByHjid(Long hjid){ 
    Query query = this.em.createQuery("SELECT patient FROM Patient patient WHERE patient.hjid =:id"); 
    query.setParameter("id", hjid); 
    return (Patient) query.getSingleResult(); 
} 

正在產生過長休眠SQL。我多次查看了調試器中的程序流程,發現它每次都會生成相同的兩個hibernate sql語句,即使我看不出爲什麼它會生成多個SQL語句。第二條語句是如此冗長,它引發以下錯誤:

java.sql.SQLException: Too many tables; MySQL can only use 61 tables in a join 

爲了保持這種張貼可讀長,我已經上傳了一些詳細的資源分配給文件共享網站。 請注意,文件共享網站中心證明了文字的正確性,即使它在日食中是正確的。您可以閱讀上述JPQL by clicking on the following link產生的兩個hibernate查詢。另外,您可以閱讀整個堆棧跟蹤at this link。您可以閱讀Patient.javaby clicking on this link的代碼。

如何更改我的代碼,以便僅從查詢中獲取少量摘要數據,從而避免所有這些愚蠢的廣泛不必要的連接?

+0

@fabienbk我在上面的OP中的鏈接文件共享站點上發佈了「患者」類的代碼。如果你點擊鏈接,你會發現它的長度是1376行,這太長了,不能直接包含在發佈中。您還希望我添加到文件共享網站的其他哪些文件? – CodeMed 2014-10-27 20:52:50

+0

所有CASCADE_ALL都可能是個問題,我現在還不確定。如果您可以使用JPA 2.1,則可以傳遞一個實體圖告訴JPA他應該加載的內容。其他方法將使用NativeQuery。 – uaiHebert 2014-10-27 21:28:07

+0

@uaiHebert謝謝。在這種情況下,'entitygraph'方法或'nativequery'方法在代碼中看起來會是什麼樣子?如果假設我只想挑選四個'Patient'的特定屬性,當'Patient'被查詢時會返回? – CodeMed 2014-10-27 23:45:17

回答