Ajuda com uma lista e um singleton

25 respostas Resolvido
LostSpirit

Bom, eu criei uma lista com um select no banco de dados, e criei ela no singleton, mas estou com duvida em como acessar os metodos, ou não é possível?

Codigo do meu DAO;

public List<Requisicao> pegarRequisicoesUser() {
	List<Requisicao> requisicoes = new ArrayList<>();
	String sql = "SELECT * FROM equipamento_requisicao equipreq INNER JOIN equipamento_user equipuser ON (equipreq.idequipamento_user = equipuser.id_equipamento_do_usuario)  INNER JOIN usuario user ON (user.id_usuario=equipuser.idusuario) INNER JOIN equipamentos equip ON (equip.id_equipamentos = equipuser.idequipamentos) INNER JOIN detalhe_status dStatus ON (dStatus.idequipamento_requisicao= equipreq.id_requisicao) INNER JOIN status_requisicao statusreq on (statusreq.id_status= dStatus.idstatus) INNER JOIN permissao p ON(user.idpermissao= p.id_permissao) INNER JOIN departamentos dp ON(user.iddepartamento = dp.id_departamentos) INNER JOIN chefe_departamento cp ON(dp.id_departamentos = cp.iddepartamento) where statusreq.categoria='Ativo' and user.id_usuario = "+ Sessao.getInstancia().getUsuario().getId() + " ";
	
	try {
		PreparedStatement stmt = con.prepareStatement(sql);
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()) {       
			//CHEFES DE DEPARTAMENTOS            
			// usuario chefe depart
			Usuario usuarioChefe = new Usuario();
			usuarioChefe.setId(rs.getLong("cp.idusuario")); 
			// usuario chefe depart
			
			// departamento chefe
			Departamento departamentoChefe = new Departamento();
			departamentoChefe.setId_departamento(rs.getInt("cp.iddepartamento"));
			// departamento chefe
			
			// INICIO DA TABELA CHEFE
			ChefesDepartamentos chefes = new ChefesDepartamentos();
			chefes.setId_chefe(rs.getInt("cp.id_chefe"));
			chefes.setCpIdusuario(usuarioChefe);
			chefes.setCpIddepartamento(departamentoChefe);
			// FIM TABELA CHEFE
			// FIM    // PARA ESTUDOS
			
			// INICIO TABELA USUARIO 
			//Permissao Usuario
			Permissao permissaoUsuario = new Permissao();
			permissaoUsuario.setId_permissao(rs.getInt("user.idpermissao"));
			permissaoUsuario.setCategoria_permissao(rs.getString("p.categoria"));
			//fim permissao usuario
			
			//incio departamento usuario
			Departamento departamentoUsuario = new Departamento();
			departamentoUsuario.setId_departamento(rs.getInt("dp.id_departamentos"));
			departamentoUsuario.setNome_setor(rs.getString("dp.nome_setor"));
			//FIM
			
			// usuario
			Usuario usuario = new Usuario();
			usuario.setNome(rs.getString("user.nome"));
			usuario.setId(rs.getLong("user.id_usuario"));
			usuario.setMatricula(rs.getString("user.matricula"));
			usuario.setLogin(rs.getString("user.login"));
			usuario.setpUsuario(permissaoUsuario);
			usuario.setdUsuario(departamentoUsuario);
			// FIM TABELA USUARIO               
			
			//equipamento // equipamento user tabelas
			Equipamentos equipamento = new Equipamentos();
			equipamento.setEquipamento_nome(rs.getString("equip.equipamento_nome"));
			equipamento.setSerial_equipamento(rs.getString("equipuser.serial_equipamento"));
			equipamento.setId_equipamento_do_Usuario(rs.getLong("equipreq.idequipamento_user"));
			
			//status tabela
			Status status = new Status();
			status.setCategoria(rs.getString("statusreq.categoria"));
			status.setIdstatus(rs.getInt("statusreq.id_status"));
			
			//status detalhes tabela
			Usuario usuarioStatus = new Usuario();//id do usuaro na tabela detalhes status
			usuarioStatus.setId(rs.getLong("dStatus.idusuario"));
			StatusDetalhes statusDetalhes = new StatusDetalhes();
			statusDetalhes.setId_statusdetalhes(rs.getLong("dStatus.id_statusdetalhes"));
			statusDetalhes.setData_status(rs.getTimestamp("dStatus.data"));
			statusDetalhes.setObservacao_status(rs.getString("dStatus.observacao"));
			statusDetalhes.setIdUsuario(usuarioStatus);
			statusDetalhes.setIdStatus(status);
			
			// Id da requisicao na tabela detalhes status
			Requisicao requisicaoStatus = new Requisicao();
			requisicaoStatus.setId(rs.getLong("dStatus.idequipamento_requisicao"));
			
			//requisicao tabela
			Requisicao req = new Requisicao();
			req.setId(rs.getLong("equipreq.id_requisicao"));
			req.setNome(rs.getString("equipreq.nome"));
			req.setData_criada(rs.getTimestamp("equipreq.data_requisicao"));
			req.setMotivo(rs.getString("equipreq.observacao"));
			req.setReqEquipamento(equipamento);
			req.setReqStatus(statusDetalhes);
			req.setReqUsuario(usuario);
			req.setReqStatus_Detalhes(statusDetalhes);
			req.setChefes(chefes);
			
			requisicoes.add(req);
		}
		
		stmt.close();
		rs.close();
	} catch (SQLException ex) {
		Logger.getLogger(RequisicaoDAO.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	}
	
	return requisicoes;
}

codigo do meu singleton:

private List<Requisicao> requisicaolist;

public List<Requisicao> getRequisicaolist() {
	return requisicaolist;
}

public void setRequisicaolist(List<Requisicao> requisicaolist) {
	this.requisicaolist = requisicaolist;
}

como eu conseguiria chamar metodos

RequisicaoDAO dao = new RequisicaoDAO();
aSessao.getInstancia().setRequisicaolist(dao.pegarRequisicoesUser());

ou não é possível e eu estou viajando?

25 Respostas

Lucas_Camara

aSessao é o nome da classe ou é uma variável? Como você está declarando isso?

LostSpirit

**

“lucastody:

aSessao é o nome da classe ou é uma variável? Como você está declarando isso?


nome da variável.
private static Sessao aSessao;

Lucas_Camara

Do jeito que vc fez, vc até consegue, só tem que tomar alguns cuidados com a validade dos dados que estão carregados no singleton.

Sendo um singleton, vc não precisa declarar variável pra ela não. Apenas chame assim:

Sessao.getInstancia().seuMetodo();
LostSpirit

mas no caso é uma lista
eu setei essa lista ao logar com um metodo do meu DAO para criar uma lista

minha dúvida é como acessar esses metodos / esses valores dessa lista.

Lucas_Camara

Use o método get que retorna a lista

List<Requisicao> requisicaolist = Sessao.getInstancia.getRequisicaolist()

Com a lista obtida, vc consegue percorrer ela e acessar seus itens e as propriedades de cada item.

LostSpirit
então no caso depois de setar essa lista

RequisicaoDAO dao = new RequisicaoDAO();

aSessao.getInstancia().setRequisicaolist(dao.pegarRequisicoesUser());

eu utilizo isso para percorrer ela?

List requisicaolist = Sessao.getInstancia.getRequisicaolist()

Lucas_Camara

Sim. Você obtem ela dessa forma e depois acessa os itens que precisar.

LostSpirit

Vlww manoo
Uma pessoa tinha me falo que isso que estou fazendo não é um singleton
é realmente isso?

Lucas_Camara

Não vi sua classe singleton completa. Mas se essa implementação estiver garantindo que terá apenas UMA instância dela no seu sistema todo, sim, é um singleton.

REFERENCIA: https://www.geeksforgeeks.org/singleton-class-java/

LostSpirit

sim sim eu instancio apenas uma vez.

package Model;

public class Sessao {
    private static Sessao instance = null;
    private Usuario usuario;
    private Matricula matricula;
    private Boletim boletim;
    private Status status;
    private Departamento departamento;
    private Equipamentos equipamentos;

    private Sessao() {
    }

    public Boletim getBoletim() {
        return boletim;
    }

    public void setBoletim(Boletim boletim) {
        this.boletim = boletim;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public Departamento getDepartamento() {
        return departamento;
    }

    public void setDepartamento(Departamento departamento) {
        this.departamento = departamento;
    }

    public Equipamentos getEquipamentos() {
        return equipamentos;
    }

    public void setEquipamentos(Equipamentos equipamentos) {
        this.equipamentos = equipamentos;
    }

    public void setMatricula(Matricula matricula) {
        this.matricula = matricula;
    }

    public Matricula getMatricula() {
        return matricula;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Long pegarID(Usuario usuario) {
        return usuario.getId();
    }

    public Usuario getUsuario() {
        return usuario;
    }  }
        return instance;
    }

}

    public static Sessao getInstancia() {
        if (instance == null) {
            instance = new Sessao();
Lucas_Camara

Está meio estranha essa classe que vc postou.

LostSpirit

está um pouco bagunçada, mas nela tem os get’s / set’s das minhas classes model.

package Model;

public class Sessao {

private static Sessao instance = null;
private Usuario usuario;
private Matricula matricula;
private Boletim boletim;
private Status status;
private Departamento departamento;
private Equipamentos equipamentos;

private Sessao() {
}

public static Sessao getInstancia() {
    if (instance == null) {
        instance = new Sessao();
    }
    return instance;
}


//gets sets
  public Boletim getBoletim() {
    return boletim;
}

public void setBoletim(Boletim boletim) {
    this.boletim = boletim;
}

public Status getStatus() {
    return status;
}

public void setStatus(Status status) {
    this.status = status;
}

public Departamento getDepartamento() {
    return departamento;
}

public void setDepartamento(Departamento departamento) {
    this.departamento = departamento;
}

public Equipamentos getEquipamentos() {
    return equipamentos;
}

public void setEquipamentos(Equipamentos equipamentos) {
    this.equipamentos = equipamentos;
}

public void setMatricula(Matricula matricula) {
    this.matricula = matricula;
}

public Matricula getMatricula() {
    return matricula;
}

public void setUsuario(Usuario usuario) {
    this.usuario = usuario;
}

public Long pegarID(Usuario usuario) {
    return usuario.getId();
}

public Usuario getUsuario() {
    return usuario;
}

}

Lucas_Camara

Sim. Essa classe está implementando singleton. Pra mim, está OK.

LostSpirit

vlw mesmo man

você pode me tirar só mais uma dúvida?

List requisicaolist = Sessao.getInstancia.getRequisicaolist()

depois de ter pegado a lista

como eu percorreria para pegar ex

req.setMotivo(rs.getString(equipreq.observacao));

ou

req.setReqUsuario(usuario);
Lucas_Camara

Vamos pegar o motivo da primeira requisição da lista:

List<Requisicao> requisicoes = Sessao.getInstancia.getRequisicaolist()
Requisicao requisicao = requisicoes.get(0);

String motivo = requisicao.getMotivo();
Usuario usuario = requisicao.getReqUsuario();
LostSpirit

vlw man
no caso
eu estaria pegando apenas o primeiro usuario ?
Usuario usuario = requisicao.getReqUsuario();
caso eu queria pegar todos teria que criar uma lista ?

Lucas_Camara

Acho que a relação não é essa. Nesse exemplo que fiz, vc está pegando o usuário da primeira requisição da lista. Nâo necessariamente é o primeiro usuário de algo.

LostSpirit

então caso eu queria pegar os usarios da lista eu queria que fazer um list

List = requisicao.getReqUsuario();

Lucas_Camara
Solucao aceita

Pelo que vi no seu código, desse jeito não funcionará, pois o método getReqUsuario() retornar um único usuário e não uma lista (pelo que entendi da sua modelagem, uma requisição possui UM usuário).

Agora, se vc quiser pegar os usuários de todas as requisições, vc consegue fazer isso percorrendo as requisições com um laço e pegando o usuário de cada item e adicionando numa lista.

List<Requisicao> requisicoes = Sessao.getInstancia.getRequisicaolist()
List<Usuario> usuarios = new ArrayList<>();

for(Requisicao req : requisicoes) {
	usuario.add(requisicao.getReqUsuario());
}
LostSpirit

vlw mano eu vou precisar de algo parecido com isso
pq vou fazer uma lista para guardar no singleton com todas as peças e suas quantidadespecas

eu teria que guardar isso em uma lista não é?
pq estou querendo utilizar para fazer uma verificação de estoque de pecas
ou tem um jeito mais fácil?

Lucas_Camara

Que tipo de verificação? Seriam as regras negociais? Se for, o ideal eh q vc mantenha isso em classes de serviço que executam queries pontuais no banco para realizar validações.

LostSpirit

não não
algo bem simples
ex na minha tabela peças eu tenho
id = 1 nome = hd qtdPecas = 20
ai eu só iria verificar se existem peças antes de inserir

Lucas_Camara

Caso não existam peças, o que o sistema deve fazer?

LostSpirit

gerar uma alert
essa peça não tem estoque

LostSpirit

No caso eu tenho isso aqui para qunado o usuario selecionar uma peça:

List<Pecas> pecasList = new ArrayList<>();
    {
        if (checkMonitor.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(1);
            pecasList.add(p);
        }
        if (checkTeclado.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(2);
            pecasList.add(p);
        }
        if (checkMouse.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(3);
            pecasList.add(p);
        }
        if (checkVGA.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(4);
            pecasList.add(p);
        }
        if (checkPlacaMae.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(5);
            pecasList.add(p);
        }
        if (checkHD.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(6);
            pecasList.add(p);
        }
        if (checkFonte.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(7);
            pecasList.add(p);
        }
        if (checkRam.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(8);
            pecasList.add(p);
        }
        if (checkCabos.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(9);
            pecasList.add(p);
        }
        if (checkGravador.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(10);
            pecasList.add(p);
        }
        if (checkBateria.isSelected()) {
            Pecas p = new Pecas();
            p.setIdpecas(11);
            pecasList.add(p);
        }
    }

e eu percorro a lista

for (Pecas pecasBD : p) {
            String pecassql = "INSERT INTO pecas_relatorio (idequipamento_requisicao,idpecas) VALUES(?,?)";
            PreparedStatement inserirpecas = con.prepareStatement(pecassql);
            inserirpecas.setLong(1, r.getId());
            inserirpecas.setInt(2, pecasBD.getIdpecas());
            inserirpecas.executeUpdate();
        }

agr eu tou pensando em um modo de fazer essa verificação de disponibilidades de peças.
Mas pensando por um lado creio que não seja correto fazer isso
pois caso tenha uma aplicação rodando em outro computador e a pessoa use uma peça
ou insira qtd e uma peça que estava com 0 em estoque
isso seria um problema…

Criado 5 de julho de 2019
Ultima resposta 5 de jul. de 2019
Respostas 25
Participantes 2