Dificuldade em trazer uma lista usando JPA2 com mais de uma condição

10 respostas
J

Alguém sabe como transformar uma consulta JDBC usando lista para o JPA com hibernate. Fiz alguns estudos na documentação como criteria e o JPQL mas não tive muito sucesso.

//consulta usando JDBC

public List listar_dados(String UF, String tipo, Object periodo) {
		conectar();

		List lista_dados = new ArrayList();
		NumberFormat formatador = new DecimalFormat("#0.0");
		NumberFormat formatador2 = new DecimalFormat("#,##0");
		try {

			statement = conexao
					.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
							ResultSet.CONCUR_READ_ONLY);
			resultset = statement
					.executeQuery("SELECT * FROM presenca where UF ='" + UF
							+ "' and periodo = '" + periodo.toString()
							+ "' and tipo= '" + tipo + "'");
			while (resultset.next()) {
				Double assistidos = new Double(resultset
						.getString("assistidos"));
				Double desassistidos = new Double(resultset
						.getString("desassistidos"));

				HashMap hashmap_dados = new HashMap();
				hashmap_dados.put("instituicao", resultset
						.getString("instituicao"));
				String assist = formatador2.format(assistidos);
				hashmap_dados.put("assistidos", assist);
				String desassist = formatador2.format(desassistidos);
				hashmap_dados.put("desassistidos", desassist);

				double aux_perc = 100 * assistidos
						/ (desassistidos + assistidos);

				String percentual = formatador.format(aux_perc) + "%";
				hashmap_dados.put("percentual", percentual);
				lista_dados.add(hashmap_dados);
			}

		} catch (SQLException Banco) {
			JOptionPane.showMessageDialog(null,
					"Erro na manipulação de banco: " + Banco);
		}
		desconectar();
		return lista_dados;
	}
//consulta usando JPQL que não deu muito certo

@SuppressWarnings("unchecked")
	public List<Object[]> BuscarTodos(String UF, String tipo, Object periodo) {
		EntityManager em = new JPAUtil().getEntityManager();
		Query query = em.createNativeQuery("SELECT * FROM presenca where UF ='" + UF
							+ "' and periodo = '" + periodo.toString()
							+ "' and tipo= '" + tipo + "'");
		List<Object[]> lista = query.getResultList();
		System.out.println(lista.get(0)[0]);
		em.close();
		return lista;
	}
DROP TABLE IF EXISTS `presenca`;
CREATE TABLE `presenca` (
  `UF` varchar(2) DEFAULT NULL,
  `instituicao` varchar(45) DEFAULT NULL,
  `assistidos` int(10) unsigned DEFAULT NULL,
  `desassistidos` int(10) unsigned DEFAULT NULL,
  `periodo` varchar(6) DEFAULT NULL,
  `tipo` tinyint(1) DEFAULT NULL,
  `id` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `presenca` VALUES ('AC', 'BANCO DO BRASIL', '17', '5', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('DF', 'BRADESCO', '22', '0', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('AM', 'CEF', '22', '0', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('PI', 'ITAÚ UNIBANCO', '2', '20', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('RS', 'SANTANDER', '3', '19', '201009', '1', '0');

Se alguém poder me ajudar não estou conseguindo utilizar qualquer consulta com critérios usando o JPA.

10 Respostas

lele_vader

A tabela não retorna linhas de presença ?

Então não precisa fazer nativeQuery.

Faça uma consulta normal com o jpql, que já irá retorna objetos de presença.

drsmachado

Por que postar esse monte de código, coloca só a query que você precisa rodar no banco.
Seja objetivo nos tópicos.

Hebert_Coelho

Calma, muita calma.

  1. Você não pode utilizar JPQL para fazer insert na tabela. Não funciona assim.
  2. Primeiro, aprenda a manipular os dados de forma simples. Aprenda como funciona um CRUD com Hibernate/JPA: Hibernate 3 com JPA 2.
  3. Depois aprenda como utilizar JPQL: JPA Consultas e Dicas.
lele_vader

Mas a consulta dele não faz insert jakefrog.
É só fazer uma consulta normal.

Olha só

statement .executeQuery("SELECT * FROM presenca where UF ='" + UF  
                            + "' and periodo = '" + periodo.toString()  
                            + "' and tipo= '" + tipo + "'");
Hebert_Coelho
lele_vader:
Mas a consulta dele não faz insert jakefrog. É só fazer uma consulta normal. Olha só
statement .executeQuery("SELECT * FROM presenca where UF ='" + UF  
                            + "' and periodo = '" + periodo.toString()  
                            + "' and tipo= '" + tipo + "'");
Ele também postou:
INSERT INTO `presenca` VALUES ('AC', 'BANCO DO BRASIL', '17', '5', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('DF', 'BRADESCO', '22', '0', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('AM', 'CEF', '22', '0', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('PI', 'ITAÚ UNIBANCO', '2', '20', '201009', '1', '0');
INSERT INTO `presenca` VALUES ('RS', 'SANTANDER', '3', '19', '201009', '1', '0');
lele_vader

Mas isso não era para demonstrar os objetos da tabela ?

Porque no sql com jdbc não tem um insert.

J

Galera na verdade eu só preciso entender como a lista no hibernate funciona com mais de um criterios.

SELECT * FROM presenca where UF ='" + UF
							+ "' and periodo = '" + periodo.toString()
							+ "' and tipo= '" + tipo + "'")

Como tranformar esse select com três parametros usando hibernate.

Hebert_Coelho

joelson123:
Galera na verdade eu só preciso entender como a lista no hibernate funciona com mais de um criterios.

SELECT * FROM presenca where UF ='" + UF
							+ "' and periodo = '" + periodo.toString()
							+ "' and tipo= '" + tipo + "'")

Como tranformar esse select com três parametros usando hibernate.

Saquei. Olha o segundo link que passei lá em cima.

lele_vader

Dá uma olhada lá no exemplo do site do jakefrog.

nana_ps

Olá…

Precisei resolver um probleminha meu usando critéria. É uma página de consultas com muitos filtros… e como alguns podem ou não ser preenchidos a quantidade de combinações de ifs para tratar tudo isso usando NamedQuery seria grande. Agora vou tentar transformar isso em algo genérico e também fazer o join de tables.

public List<Pedido> listByFilters(Terminal terminal, TerminalTicket terminalTicket, Long numInicial, Long numFinal){
		
		CriteriaBuilder cb = dao.getEm().getCriteriaBuilder();
		CriteriaQuery<Pedido> query = cb.createQuery(Pedido.class);
		Root<Pedido> cust = query.from(Pedido.class);
		query.select(cust);
		
	    List<Predicate> predicateList = new ArrayList<Predicate>();
	    
	    Predicate terminalTicketPredicate, numInicialPredicate, numFinalPredicate;
	 
	    if ((terminalTicket != null)) {
	    	terminalTicketPredicate = cb.equal(cust.get("terminalTicket"), terminalTicket);
	        predicateList.add(terminalTicketPredicate);
	    }
	 
	    if ((numInicial != null)) {
	    	numInicialPredicate = cb.equal(cust.get("numTicketInicial"), numInicial);
	        predicateList.add(numInicialPredicate);
	    }
	    
	    if ((numFinal != null)) {
	    	numFinalPredicate = cb.equal(cust.get("numTicketFinal"), numFinal);
	        predicateList.add(numFinalPredicate);
	    }
	 
	    Predicate[] predicates = new Predicate[predicateList.size()];
	    predicateList.toArray(predicates);
	    query.where(predicates);
		
		return dao.getEm().createQuery(query).getResultList();
	}
Criado 14 de junho de 2012
Ultima resposta 14 de jun. de 2012
Respostas 10
Participantes 5