2012-12-08 26 views
-1

我用這個查詢在MySQL(TBL 1中的每一個記錄都有TBL2中的記錄列表):我的JPA Native Query中發生了什麼?

select tbl1.id, tbl2.id from parenttable1 tbl1 join childtable2 tbl2 on tbl1.id = tbl2.tbl1Id 

,結果是真實的,但是當我用這個作爲一個原生查詢(javax.persistence.EntityManager# createNativeQuery())在我的應用程序中重複tbl2.id。問題是什麼?

的結果是這樣的:

id id 
11 1 
11 1 
22 3 
33 4 
44 5 
44 5 
44 5 

但我相信:

id id 
11 1 
11 2 
22 3 
33 4 
44 5 
44 6 
44 7 

我的代碼是這樣的:

List<MyDTO> foundList = (List<MyDTO>) entityManager.createNativeQuery("the query above", MyDTO.class).getResultList();

+0

你是什麼意思的本機查詢? –

+0

我的意思是javax.persistence.EntityManager#createNativeQuery() – nazila

+0

這樣的查詢的結果怎麼能成爲'true'?向我們展示您的代碼,您的數據,您期待的結果以及您獲得的實際結果。 –

回答

0

非常感謝您的靈感。問題是@ Id存在於父表的id字段而不是子表的id字段(在DTO內)!

2

我沒有看到JPA如何映射返回兩列的查詢結果如果你沒有告訴如何映射這兩列,那麼它將與DTO同名。而且你甚至不顯示DTO的外觀。

執行下面的代碼,一切都應該罰款:你被要求

List<Object[]> list = (List<Object[]>) em.createNativeQuery(sql).getResultList(); 
List<MyDTO> result = new ArrayList<MyDTO>(list.size()); 
for (Object[] row : list) { 
    result.add(new MyDTO((Long) row[0], (Long) row[1])); 
} 

而下一次,以顯示你的代碼,,而不是認爲它是完美的或明顯的,並且在錯誤必然來自其他地方。 99.999%的時間,這個錯誤在你的代碼,而不是在數百萬開發人員使用和測試的庫的代碼。