Pessoal quero saber qual o mais correto e eficiente dentre as opções vou mostrar,
por exemplo tenho um bean Estado, e um bean Pais. no meu modelo de negocios
tenho um listAll() para obter todos estados, porém sem conter o paises, entao se
eu quizer os paises devo fazer:
public List<Estado> loadEstadosWithPais() {
List<Estado> estados = estadoRepository.listAll();
for (Estado estado : estados) {
int idPais = estado.getPais().getIdPais();
estado.setPais( paisRepository.loadById(idPais) );
}
return estados;
}
Ou no meu repositorio de Estados criar um metodo que já me volte os carregado
usando sql para relacionar, tipo um
"SELECT e.idEstado, p.idPais, e.nomeEstado, p.nomePais FROM Estado e, Pais p WHERE e.idPais = p.idPais"
?
A vantagem do sql é que será apenas uma query que vai me retornar tudo.
e da forma com o codigo acima, se eu tiver 100 estados, serão 100 queryes.
Oque sugerem?
Faz uma consulta só para a tabela de países, monta uma lista com todos os países e depois busca na lista o país para cada estado ao invés de consultar o banco.
OK, seria então conveniente, converter a Lista para um
Map<Integer, Pais> ?
Assim
public List<Estado> loadEstadosWithPais() {
List<Estado> estados = estadoRepository.listAll();
List<Pais> paises = paisRepository.listAll();
Map<Integer, Pais> paisMap = new HashMap<Integer, Pais>();
for (Pais pais : paises) {
paisMap.put(pais.getIdPais(), pais);
}
for (Estado estado : estados) {
estado.setPais( paisMap.get(estado.getPais().getIdPais()) );
}
return estados;
}
[quote=robertwgil]OK, seria então conveniente, converter a Lista para um
Map<Integer, Pais> ?
Assim
public List<Estado> loadEstadosWithPais() {
List<Estado> estados = estadoRepository.listAll();
List<Pais> paises = paisRepository.listAll();
Map<Integer, Pais> paisMap = new HashMap<Integer, Pais>();
for (Pais pais : paises) {
paisMap.put(pais.getIdPais(), pais);
}
for (Estado estado : estados) {
estado.setPais( paisMap.get(estado.getPais().getIdPais()) );
}
return estados;
}
[/quote]
Não sei como estão os atributos da sua classe Estado, mas no código acima você está dando “getPais” dentro do setPais e como você ainda não tem o objeto pais na classe estado provavelmente dará uma exceção.
Como você sabe qual PAÍS de um determinado ESTADO?
Use esse identificador para buscar no MAP.
Pelo select do primeiro post acho que deveria ser :
for (Estado estado : estados) {
estado.setPais( paisMap.get(estado.getIdPais() );
}
Att.
Eduardo
A sim com isso voce vai entender:
Classe Estado:
private int idEstado;
private String nomeEstado;
private Pais pais;
private Set<Cidade> cidades;
Dao do Estado:
public List<Estado> listAll() {
Statement st = null;
ResultSet rs = null;
try {
st = conn.createStatement();
rs = st.executeQuery("SELECT * FROM Estado");
List<Estado> list = new ArrayList<Estado>();
Estado estado;
while(rs.next()){
estado = new Estado();
estado.setIdEstado(rs.getInt("idEstado"));
estado.setNomeEstado(rs.getString("nomeEstado"));
estado.setPais(new Pais(rs.getInt("idPais")));
list.add(estado);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs != null) try { rs.close(); } catch (SQLException e) { }
if(st != null) try { st.close(); } catch (SQLException e) { }
}
return null;
}
No listAll() do estado há um bean Pais, porém apenas com o id que é
o atributo que ralaciona as tabelas.
Entendi. Então o código que você vai rodar sim.