Seguinte, eu estou usando os padrões de projeto DAO e Facade, mas meu problema é que eu tenho uma classe Pedido:
public class Pedido {
private int id;
private Usuario usuario;
private Cliente cliente;
private List<Item> itens;
private List<Parcela> parcelas;
}
Quando eu estava implementando a DAO encontrei um problema, para eu listar todos os pedidos eu terei que buscar todos os outros dados de usuario, cliente, itens, parcelas. Mas até onde eu sei, a DAO não pode ter relacionamento com outras DAO (no caso a DAO de usuario, cliente e etc). Eu pensei em fazer um INNER JOIN no SELECT mas eu acho que isso iria fugir do padrão DAO.
public class PedidoDaoImpl extends GenericDao implements PedidoDao{
private final String sqlListar = "SELECT * FROM tb_pedido p INNER JOIN tb_usuario u ON p.id_usuario = u.id INNER JOIN tb_pessoa pj ON p.id_cliente = pj.id";
private final String sqlListarItens = "SELECT * FROM tb_iten i INNER JOIN tb_produto p ON i.id_produto = p.id WHERE id_pedido = ?";
private final String sqlListarParcelas = "SELECT * FROM tb_parcela WHERE id_pedido = ?";
public List<Pedido> listar() {
List<Pedido> pedidos = new ArrayList<Pedido>();
ResultSet rs = this.executeQuery(sqlListar);
try{
while(rs.next()){
Pedido pedido = new Pedido();
pedido.setId(rs.getInt("p.id"));
Usuario usuario = new Usuario();
usuario.setId(rs.getInt("u.id"));
usuario.setLogin(rs.getString("u.login"));
usuario.setNome(rs.getString("u.nome"));
usuario.setSenha(rs.getString("u.senha"));
pedido.setUsuario(usuario);
Cliente cliente = new Cliente();
cliente.setId(rs.getInt("pj.id"));
pedido.setCliente(cliente);
List<Item> itens = new ArrayList<Item>();
PreparedStatement pstmIten = this.getPreparedStatement(sqlListarItens);
pstmIten.setInt(1, pedido.getId());
ResultSet rsItem = this.executeCommand(pstmIten);
while (rsItem.next()) {
Item item = new Item();
item.setId(rsItem.getInt("i.id"));
Produto produto = new Produto();
produto.setId(rsItem.getInt("i.id_produto"));
produto.setNome(rsItem.getString("p.nome"));
produto.setPreco(rsItem.getFloat("p.preco"));
item.setProduto(produto);
item.setQuantidade(rsItem.getInt("i.quantidade"));
itens.add(item);
}
pedido.setItens(itens);
List<Parcela> parcelas = new ArrayList<Parcela>();
PreparedStatement pstmParcela = this.getPreparedStatement(sqlListarParcelas);
pstmParcela.setInt(1, pedido.getId());
ResultSet rsParcela = this.executeCommand(pstmParcela);
while (rsParcela.next()) {
Parcela parcela = new Parcela();
parcela.setId(rsParcela.getInt("id"));
parcela.setImposto(rsParcela.getFloat("imposto"));
parcela.setValor(rsParcela.getFloat("valor"));
parcela.setVencimento(rsParcela.getDate("vencimento"));
parcela.setSituacao(rsParcela.getString("situacao"));
parcelas.add(parcela);
}
pedido.setParcelas(parcelas);
}
return pedidos;
} catch (SQLException ex) {
Logger.getLogger(PedidoDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
}
Então esse é o meu problema, conto com a experiência e ajuda de vocês.
Obrigado.