2015-04-22 133 views
0

我的應用程序中有一個對象產品。這個對象有一個列表項(ArrayList)。在數據庫中我有兩個表格:Product和Item。商品具有與產品ID相關的外部產品ID。從數據庫獲取對象列表

從數據庫獲取產品並獲取產品清單非常簡單。

如何從數據庫中獲取產品列表,其中將包含所有相關項目?

據我所知,爲列表中的每個產品調用dao效率不高。如何管理查詢或創建對象以使其更高效?

我正在使用Spring JdbcTemplate從數據庫中獲取數據。目前,我正在獲取DAO類中的產品列表,並直接從那裏爲每個項目調用ItemDAO。數據庫是MySQL。

更新 好的,可能我在第一種方法中還不清楚。目標是從數據庫獲取嵌套列表以及如何使其在性能方面更好。

public class Product { 
    private Integer id; 
    private String name; 
    private String description; 
    private ArrayList<Item> items; 
    private Timestamp timeAdded; 
} 

public class Item { 
    private String name; 
    private Float price; 
    private String type; 
    private Integer productId; 
} 

public ArrayList getProducts(String searchName) throws SQLException { 
    ArrayList<Product> products = new ArrayList<Product>(); 
    String sql = "SELECT * FROM product WHERE name LIKE '%" + searchName + "%'"; 
    List<Map> rows = getJdbcTemplate().queryForList(sql); 
    for (Map row : rows) { 
     Product product = setNewProduct(row); 
     products.add(product); 
    } 
    return products; 
} 

private Product setNewProduct(Map row) { 
    Product product = new Product(); 
    product.setId((Integer) row.get("id")); 
    product.setName((String) row.get("name")); 
    product.setDescription((String) row.get("description")); 
    ItemsDao itemsDao = (ItemsDao) appContext.getBean("itemsDao"); 
    ArrayList<Item> items = itemsDao.getItems(product.getId()); 
    if (items.size() > 0) { 
     product.setItems(items); 
    } 
    product.setTimeAdded(new java.util.Date(((Timestamp) row.get("time_added")).getTime())); 
} 

In ItemsDao class我只是根據發送的ID獲取產品的物品列表。

所以問題是如何調用產品列表並獲取每個產品中的物品清單? (也許在一個複雜的SQL語句?)。現在性能非常糟糕,因爲當有30種產品每種都有10種產品時,爲了獲得整個產品列表,必須多次調用數據庫。

回答

0

答案是,你不能在使用ORM時,當你有任何數量的數據時,它們都會像垃圾一樣執行。如果您延遲加載相關集合並僅使用其中一些,但是如果您需要顯示子對象的字段,那麼您可以獲得超過100,000個查詢來加載頁面。相信我,我只是想使用Doctrine來運行200,000個查詢來優化頁面。

,你所要做的就是要麼分頁結果,或編寫加入了數據的自定義查詢,然後處理與循環控制的結果:如

$sql = "SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.fk_id"; 
// run query and get resdults 
$cur_prod = ''; 
While(// fetch a row){ 
    if($row['prod'] != $cur_prod){ 
    $cur_prod = $row['prod']; 
    // start the new record in your layout 
    } 
    echo $row['t1.f1']; 
    echo // blah blah blah the related data 
} 

什麼,我在這裏得到是你必須跟蹤父產品並在產品發生變化時管理輸出。