2015-04-22 157 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 
} 

什么,我在这里得到是你必须跟踪父产品并在产品发生变化时管理输出。