JPQL L*KE / JPA Query Language

  • Themenstarter Themenstarter Gelöschtes Mitglied 5909
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gelöschtes Mitglied 5909

Gast
Ich hab ein kleines Problemchen mit JPQL und zwar speziell mit LIKE

Im Moment erzielt man bei meiner Suchfunktion nur treffer, wenn das Wort exakt übereinstimmt,
was bei einer Suche natürlich nicht sonderlich toll ist.

Wildcards wie %:value% funktionieren nicht, da schmeißt er ne Exception

Code:
    public List<Tag> getTagsByValue(String value) {
        String jpql = "SELECT x from Tag x where x.value LIKE :value";
        Query query = entityManager.createQuery(jpql);
        query.setParameter("value", value);
        try {
            entityManager.getTransaction().begin();
            List<Tag> resultList = query.getResultList();
            for (Tag tag : resultList) {
                entityManager.refresh(tag);
            }
            entityManager.getTransaction().commit();
            return resultList;
        } catch (Exception e) {
            e.printStackTrace();
            return Collections.emptyList();
        }
    }

bei google bin ich noch auf ESCAPE gestoßen, wobei ich ja eigentlich erstmal nix escapen will...

vielleicht hat ja jemand eine Idee.

p.s.: Die Transaktion ist nötig um das Refresh durchzuführen und das ist nötig weil ich sonst teilweise alte Daten ausm Cache bekomm... (geht vielleicht anders besser, ist aber nicht wichtig)
 
Hallo das sollte Funktionieren
Code:
Select x From-... where Kunde-name Like 'Mül%'
Gruß Manuela
 
query.setString("value", value);
auch wenn das für sich keinen Unterschied machen dürfte

was steht denn in Value genau drin, und welche Exception genau?
 
Dann probiere mal das hier:
eine neue Idee
Code:
public List<Tag> getTagsByValue(String value) { 
        String jpql = "SELECT x from Tag x where x.value LIKE :value"; 
        Query query = entityManager.createQuery(jpql); 
        query.setParameter("value", value+"%'"); //setz dir deinen Sting einfach hier zusammen.
        try { 
            entityManager.getTransaction().begin(); 
            List<Tag> resultList = query.getResultList(); 
            for (Tag tag : resultList) { 
                entityManager.refresh(tag); 
            } 
            entityManager.getTransaction().commit(); 
            return resultList; 
        } catch (Exception e) { 
            e.printStackTrace(); 
            return Collections.emptyList(); 
        } 
    }

gruß Manuela.
 
nana, nix falsches vorschlagen,
auch ohne % sollte es keine Exception geben und das Anführungszeichen hinter dem % ist ja nun gewiss nicht gewollt
 
hab das jetzt so gelöst:

Code:
    public List<Tag> getTagsByValueLike(String value) {
        value = "%" + value.toLowerCase() + "%";
        String jpql = "SELECT x from Tag x where LOWER(x.value) LIKE :value";
        Query query = entityManager.createQuery(jpql);
        query.setParameter("value", value);
        try {
            entityManager.getTransaction().begin();
            List<Tag> resultList = query.getResultList();
            for (Tag tag : resultList) {
                entityManager.refresh(tag);
            }
            entityManager.getTransaction().commit();
            return resultList;
        } catch (Exception e) {
            e.printStackTrace();
            return Collections.emptyList();
        }
    }

Eine Exception in dem code oben gabs nicht, wollte ja nur meine suchergebnisse verbessern.

Wobei z.B. bei
Code:
String jpql = "SELECT x from Tag x where LOWER(x.value) LIKE %:value%
ne exception aufgetreten ist (could not parse query oder so ähnlich)
 
also das ist nun klar, :value wird letztlich in 'string' umgewandelt und

SELECT x from Tag x where LOWER(x.value) LIKE %'string'%

ist eindeutig falscher als

SELECT x from Tag x where LOWER(x.value) LIKE '%string%'


wenn schon, dann ginge nur
query.setParameter("value", "%"+value+"%");
oder ähnliches
 
Hallo,
und was habe ich dan falsches gesagt.

ob man oben den String zusammenbaut
oder
query.setParameter("value", "%'"+value+"%');

ist doch eigendlich Jacke wie Hose.

Gruß Manuela :meld:
 
Hallo
doch ein Fehler

muß natürlich

query.setParameter("value", "%"+ value+"%");

gruß Manuela
 
was du diesmal geschrieben hast ist nicht kompilierbar, das doppelte Anführungszeichen hinter dem letzten % fehlt,

dafür sind umso mehr einfache Anführungszeichen dabei, diesmal zwei,
die haben da nix zu suchen,

edit: ok, hast du nun auch korrigiert
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben