Problemas com consulta em hql

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?

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.

você está falando da “SEQ_STORE”?

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

1 curtida

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

Coloca o código inteiro dessa parte.

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.

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.