Problemas com consulta em hql

7 respostas Resolvido
L

Estou fazendo um projeto de cadastro.
O objetivo é cadastrar e consultar clientes e funcionários, no entanto, já é possível salvar os dados, o problema é consultar.
para consulta fiz formulários JPanel(estou usando netbeans), onde para consultar deve-se preencher o campo nome e Email para ambos formulários e então basta clicar no botão consultar.

o código que inseri no botão consultar é o seguinte:

ClienteControle cc = new ClienteControle();

try {

List ListaDeClientes = cc.buscar(txbNome.getText(),

txbEmail.getText());

DefaultTableModel model =

(DefaultTableModel) tbResultados.getModel();

for (int i = model.getRowCount() - 1; i >= 0; i–) {

model.removeRow(i);

}

if (ListaDeClientes != null) {

for (int i = 0; i < ListaDeClientes.size(); i++) {

Cliente cliente = ListaDeClientes.get(i);

String[] c = new String[]{

cliente.getNome(),

cliente.getEmail()};

model.insertRow(i, c);

}

}

tbResultados.setModel(model);

} catch (Exception e) {

JOptionPane.showMessageDialog(this,

“Não foi possível realizar a consulta de clientes!\n\n+ e.getLocalizedMessage());

}

no código acima instanciei a classe ClienteControle que tem o seguinte método:
public List buscar(String nome, String email)

throws Exception {

return null;

}

depois criei o seguinte método dentro da classe ClienteDAO para que pudesse consultar perante a conexão com o banco de dados:

public List getListaDeClientes(String nome, String email)

throws Exception {

EntityManager em = getEntityManager();

try {

String hql ="";

if(nome != null && !nome.equals("")) {

hql += " WHERE nome like upper (:nome)";

}

if (email != null && !email.equals("")) {

if (!hql.equals("")) {

hql += " AND email like lower(:email)";

} else {

hql += " WHERE email like lower(:email)";

}

}

hql = FROM Cliente + hql;

Query q = em.createQuery(hql);

if(nome != null && !nome.equals("")) {

q.setParameter(nome”, % +

nome.toLowerCase() + &);

}

if (email != null & !email.equals("")) {

q.setParameter(email”, % +

email.toLowerCase() + %);

}

return q.getResultList();

} finally {

em.close();

}

}

e depois alterei o método buscar do ClienteControle para:

public List buscar(String nome, String email)

throws Exception {

return new ClienteDAO().getListaDeClientes(nome, email);

}

o botão deveria executar normalmente mas aparece essas mensagens de erro:

Exception Description: An exception was thrown while searching for pesistence archives with ClassLoader: sun.misc.Launcher$AppClassLoader@5c647e05

Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018](Eclipse Persistense Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException

Exception Exception Description: Predeployment of PersistenceUnit[CadastroPU] failed.org.eclipse.persistence.exceptions.ValidationException

Internal Exception: Exception [EclipseLink-7299](Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd)

Exception Description: Conflicting annotations with the same name [SEQ_STORE] were found. the first one [@javax.persistence.SequenceGenerator({allocationSize=20, name=SEQ_STORE, sequenceName= funcionario_seq})] was found within [class cadastro.Pessoa.Funcionario] and the second [@javax.persistence.SequenceGenerator({allocationSize=20, name=SEQ_STORE, sequenceName=cliente_seq})] was found within [class cadastro.Pessoa.Cliente]. Named annotations must be unique across the persistence unit.

por que aparece isso? tem como solucionar?

7 Respostas

darlan_machado

Ler a mensagem de erro e tentar compreendê-la é parte da rotina de qualquer desenvolvedor.
Note que o problema não é a hql, porém, como ela deve ter originado a primeira chamada da estrutura do hibernate, ocorreu a exceção.
O problema está no mapeamento das classes Funcionario e Cliente.
Ambos estão apontando para a mesma sequence. Você deve fazer com que cada um aponte para uma sequence diferente.

L

você está falando da “SEQ_STORE”?

darlan_machado

Eu não, quem está falando é a mensagem de exceção

L

tá resolvido, porém apareceu mais uma exceção ao criar uma consulta no entityManager, a descrição é a seguinte:

syntax error parsing [FROM Cliente WHERE nome like upper (:nome) AND email like lower(:email)].
[13,13] An identification variable must be provided for a range variable declaration.

eu entendi a primeira parte, porém não entendi onde devo criar a varável de identifcação

darlan_machado

Coloca o código inteiro dessa parte.

L

mas onde? dentro do entityManager?
o código a que se refere é o que está dentro da classe ClienteDAO?

enviarei um print para ter uma maior noção do que estou tentando falar.
https://drive.google.com/open?id=1FrDqMr_z2ZO51zN0tNt3ZkU1LPIt7XJh

caso puder ajudar, fico agradecido.

L
Solucao aceita

Eu consegui resolver, alterei o nome de cada uma das sequence, e após era necessário acrescentar uma variável à clausula “FROM Cliente”, e também ao nome e email

obrigado pela ajuda.

Criado 13 de março de 2018
Ultima resposta 14 de mar. de 2018
Respostas 7
Participantes 2