[RESOLVIDO] JPA e LIKE

Estou com um problema aqui… e as soluções encontradas, inclusive aqui no forum, não estão resolvendo.

Tenho o seguinte método:

    public List ListaPaises(String NomePais) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Vestibulando_ManagerPU");
        EntityManager em = emf.createEntityManager();
        List<Pais> result = null;
        try {
            result = em.createNamedQuery("Pais.findByNomePais")
                    .setParameter("nomePais", NomePais)
                    .getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (result);
    }

Quando envio Brasil na string ele acha perfeitamente. Agora preciso que se eu enviar B ele ache brasil, bolívia, e etc… ou seja um LIKE. Nas soluções que encontrei diz para alterar assim:

.setParameter("nomePais", "%" + NomePais)

ou

.setParameter("nomePais", "%" + NomePais + "%")

Mas em nenhum deles deu certo. Quando faço isto ele não retorna nada, nem uma exception. =/
Alguma ajuda?

Tópicos com mesmo problema que eu mas não resolveu:

Queria fazer com named, se não for possível parto para o createquery, mas não queria ter SQL solto no código.

Poste a query JPQL por favor.

@NamedQuery(name = "Pais.findByNomePais", query = "SELECT p FROM Pais p WHERE p.nomePais = :nomePais"),

Tentei com @NamedQuery(name = "Pais.findByNomePais", query = "SELECT p FROM Pais p WHERE p.nomePais LIKE :nomePais"), e tambem não funcionou. =/

A query é esta mesma.

Para você usar a expressão like nos parametros:

.setParameter("nomePais", "%" + NomePais + "%")  

Você precisa usá-la na sua query:

@NamedQuery(name = "Pais.findByNomePais", query = "SELECT p FROM Pais p WHERE p.nomePais LIKE :nomePais")

Troque seu “=” por “LIKE” também na query.

1 curtida

Estranho não ter funcionado.
Note que em muitos bancos, as querys são CASE Sensitive

tente usar algo como:

@NamedQuery(name = "Pais.findByNomePais", query = "SELECT p FROM Pais p WHERE LOWER(p.nomePais) LIKE :nomePais") 

no seu parametro tente:

.setParameter("nomePais", "%" + NomePais.toLowerCase() + "%") 
1 curtida

Ja agradeço pela ajuda mas ainda não esta indo, e o mais engraçado.

seguinte Namedquery: @NamedQuery(name = "Pais.findLikeNomePais", query = "SELECT p FROM Pais p WHERE p.nomePais LIKE :nomePais"),
Seguinte Método: public List ListaPaises(String NomePais) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("Vestibulando_ManagerPU"); EntityManager em = emf.createEntityManager(); List<Pais> result = null; try { result = em.createNamedQuery("Pais.findLikeNomePais") .setParameter("nomePais", "%" + NomePais) .getResultList(); } catch (Exception e) { e.printStackTrace(); } return (result); }

Se envio BRASIL, Brasil, brasSIL, BrASiL, tudo retorna um registro,
mas se envio Bras, B, b, que deveria retornar os dados simplesmente não retorna NADA. =/

Pela lógica se fosse problemas de casesensitive B ou b deveria retornar algo pelo menos, e Brasil e brasil deveria dar resultados diferentes.

Passe o parâmetro desta forma:

.setParameter("nomePais", "%" + NomePais + "%")  

O % determina que o sistema deve considerar qualquer valor antes ou depois de valores literais

Tipo:

“Jose da Silva”

%jose - Faz referencia a tudo que contenha jose no fim, e qualquer coisa antes
%jose% - Faz referencia a tudo que contenha jose antes ou depois de qualquer coisa
%jose%silva - Faz referencia a todos os joses, com outros sobrenomes no meio do nome, terminando com silva

Agora que me toquei que estava fazendo o like errado. kkk

no lugar de .setParameter("nomePais", "%" + NomePais)
usar .setParameter("nomePais", NomePais + "%")

desculpe pelas mancadas, mas eh tanto trem dando errado que eu já desespero antes de pensar. kkkk

Muito obrigado ai gente. Marcando como resolvido.

Um tópico importante aqui para quem tambem apresentar o problema é alem de trocar o modo de passar o parametro é importar REMONTAR A NAMEDEQUERY lá na classe de modelo.