GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Map em java

Fala galera, tudo certo? eu estava utilizando switch case para fazer uma classe de pesquisa no banco de dados, para tentar deixar o mais genérica possível para poder reutilizar em mais classes, porém meu chefe pediu para passar para map, só que eu não estou achando uma forma de passar por parâmetro os dados que preciso

Classe onde envio a chave para o método(tableSearchName é o nome do campo que eu quero utilizar pra fazer a busca)

public void sqlConsulta(String tableSearchName) {
  final Map<String, Supplier<Map<String, Object>>> makeSqlSearch = new HashMap<>();
  final MapConsultasSql consulta = new MapConsultasSql();
  makeSqlSearch.put(tableSearchName, consulta::likeSearch);
}

método que eu estou tentando utilizar para fazer a consulta:

public Map<String, Object> likeSearch() {
  final Map<String, Object> expression = new HashMap<>();
  expression.put("Nome", "select * from usuario where usuid like '%"+ nomeDigitado +"%'");
  return expression;
}

O que eu queria era poder passar o “nomeDigitado” por parâmetro no likeSearch, para então poder fazer a busca, porém não achei uma forma de passar parâmetro pra um map. Alguém saberia me dizer se é possível isso que estou tentando fazer ou não tem como?

JDBC puro? Seu problema não é o Map.

expression.put( "Nome", "select * from usuario where usuid like ?" );

Na hora que for usar:

String query = expression.get( "Nome" );

PreparedStatement stmt = suaConexao.prepareStatement( query );
stmt.setString( 1, "%" + variavelComOUsuid + "%" );

ResultSet rs = stmt.executeQuery();

Eu estou usando o hibernate na vdd, é que a minha ideia era fazer métodos para popular 3 tabelas que utilizam AbstractTableModel, mas queria uma classe genérica que fizesse isso pra mim, sem a necessidade de ficar repetindo código, porém desisti do map pois não consigo passar uma tableModel genérica

Exemplo do meu código:

public <T> ConsultasSql(JTable table, Class<T> classe,  String className, String search, JComboBox<String> box,JTextField field) {
		logger.info("Populando a tabela");
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("fca");
	    EntityManager em = emf.createEntityManager();
	    List<T> classes;
	    if(field.getText().trim().equals("")) {
	    	TypedQuery<T> queryAll = em.createQuery("SELECT u FROM "+className+" u", classe);
	    	classes = queryAll.getResultList();
	    }else {
		    TypedQuery<T> queryLike = em.createQuery("SELECT u FROM "+className+" u WHERE "+box.getSelectedItem()+" LIKE '%"+search+"%'", classe);
		    classes = queryLike.getResultList();
	    }
	    //Aqui é onde não consigo substituir para poder setar os valores em qualquer tabela em que esse método seja chamado, pois dependo do método atualizar do model da tabela
	    UsuarioTableModel model = (UsuarioTableModel) table.getModel();
	    model.atualizar(classes); 
	}

Não sei se essa seria a maneira mais performática, mas foi o que consegui fazer para reduzir o código já que ele vai se repetir pelo menos mais 3 vezes;

Vc quer poder usar um TableModel genérico tbm, é isso? Ali nas últimas linhas.

Isso, queria deixar o mais genérico possível pra facilitar manutenção etc.

//