2016-02-18 114 views
1

考慮這些豆子面對一個嵌套豆查詢:使用了Spring JDBC模板

class Country { 
    String name; 
    String code; 
    ... 
    List<City> cities; 
} 

class City { 
    String name; 
    String zip; 
    ... 
    List<Street> streets; 
} 

class Street { 
    String name; 
} 

我不得不從數據庫中的3個表獲取嵌套豆。

我可以通過兩種方式解決:

  • 查詢循環(各國查詢,循環結果查詢自己的城市的研究,結果循環查詢他們的街道....)

  • 完全平放的數據源(一個單一的廣泛選擇連接所有3個表,所有行的最大細節按外部到內部字段排序),並在那之後進行分割。

第一個問題:是否第二個解決方案是考慮到嵌套層次可以超過3層的最佳選擇?

比方說,是的,我想用第二個選項:

select * 
from countries c 
join cities t ... 
join streets s ... 
order by c.name, c.code, ..., t.name, t.zip, ... 

第二個問題:我怎麼能存儲在豆類ResultSetJdbcTemplate

是否有這樣的目的,將行拆分成嵌套的bean?我無法使用自定義RowMapper,因爲我沒有爲每一行分配一個外部bean。

回答

0

表現明智的第一個解決方案是非常糟糕的。這意味着您將對數據庫運行大量查詢,這些查詢的數量實際上取決於行數。

我相信數據庫只是無法處理,最終。

第二種方法好得多,您可以在一個查詢中處理它,並且由於您使用jdbc模板,因此創建相應的對象必須不難。

如果您仍然有很多數據,您可能需要考慮使用分頁檢索(帶來100條記錄,而不是帶來另外100條記錄)。

大多數數據庫驅動程序已經以這種或那種方式做到了這一點,如果您不想一次保存所有數據,您可能需要爲此添加一個「應用程序級」取決於用例。

如果表一個非常大的,雖然加入也可以costy,但在這種情況下,第一種方法在任何情況下(因爲命令datasize大太多的查詢)失敗

希望這有助於

+0

謝謝Mark,但是如何將平面結果集「拆分」爲嵌套的bean? Spring jdbctemplate是否爲這種模式實現了一些東西? – Tobia

+0

我剛纔提到的執行查詢的方法有所不同。對於你的問題:請在這裏閱讀答案(接受的):http://stackoverflow.com/questions/16718163/jdbctemplate-set-nested-pojo-with-beanpropertyrowmapper –

+0

非常有趣的「自動增長」設置,但在我的case我無法理解如何使用rowmapper,因爲如果我有100rows,我不會期望100外豆... – Tobia