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

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.

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.

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

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.

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 + "'");  

[quote=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 + "'");  

[/code][/quote] Ele também postou:[code]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');

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

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

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.

[quote=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.[/quote]Saquei. Olha o segundo link que passei lá em cima.

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

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();
	}