Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从数据库中获取对象列表_Java_Mysql_Database_Object_Jdbctemplate - Fatal编程技术网

Java 从数据库中获取对象列表

Java 从数据库中获取对象列表,java,mysql,database,object,jdbctemplate,Java,Mysql,Database,Object,Jdbctemplate,我的应用程序中有一个对象产品。此对象的ArrayList中有一个项目列表。在数据库中,我有两个表:Product和Item。项目具有与产品id外键连接的产品id 从数据库中获取产品,然后获取产品的项目列表非常简单 如何从数据库中获取产品列表,其中包含所有相关项目 据我所知,为列表中的每个产品调用dao是不高效的。如何管理查询或对象创建以提高效率 我使用SpringJDBCTemplate从数据库中获取数据。目前,我正在获取DAO类中的产品列表,从那里我直接为每个项目调用ItemDAO。数据库是M

我的应用程序中有一个对象产品。此对象的ArrayList中有一个项目列表。在数据库中,我有两个表:Product和Item。项目具有与产品id外键连接的产品id

从数据库中获取产品,然后获取产品的项目列表非常简单

如何从数据库中获取产品列表,其中包含所有相关项目

据我所知,为列表中的每个产品调用dao是不高效的。如何管理查询或对象创建以提高效率

我使用SpringJDBCTemplate从数据库中获取数据。目前,我正在获取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()));
}
在ItemsDao类中,我只是根据发送的ID获取产品的项目列表


所以问题是如何调用产品列表并获取每个产品中的项目列表?可能在一个复杂的SQL语句中?。现在性能非常糟糕,因为当有30个产品,每个产品有10个项目时,要获得整个产品列表,它必须多次调用数据库。

答案是,在使用ORM时,你不能这样做,当你有任何数量的数据时,它们都会像垃圾一样执行。如果延迟加载相关集合并且只使用少数集合,那么可以,但是如果需要显示子对象中的字段,则可以获得100000多个页面加载查询。相信我,我只是想用运行200000个查询的原则来优化页面

您需要做的是对结果进行分页,或者编写一个自定义查询来连接数据,然后使用循环控件处理结果:例如

$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
}
我在这里得到的是,您必须跟踪父产品,并在其发生变化时管理输出