# JPQL L*KE / JPA Query Language



## Gelöschtes Mitglied 5909 (20. Nov 2008)

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


```
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)


----------



## Manuela (25. Nov 2008)

Hallo das sollte Funktionieren

```
Select x From-... where Kunde-name Like 'Mül%'
```
Gruß Manuela


----------



## SlaterB (25. Nov 2008)

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?


----------



## Manuela (25. Nov 2008)

Dann probiere mal das hier:
eine neue Idee

```
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.


----------



## SlaterB (25. Nov 2008)

nana, nix falsches vorschlagen,
auch ohne % sollte es keine Exception geben und das Anführungszeichen hinter dem % ist ja nun gewiss nicht gewollt


----------



## Gelöschtes Mitglied 5909 (25. Nov 2008)

hab das jetzt so gelöst:


```
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 

```
String jpql = "SELECT x from Tag x where LOWER(x.value) LIKE %:value%
```
ne exception aufgetreten ist (could not parse query oder so ähnlich)


----------



## SlaterB (25. Nov 2008)

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


----------



## Manuela (25. Nov 2008)

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:


----------



## Manuela (25. Nov 2008)

Hallo
doch ein Fehler

muß natürlich 

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

gruß Manuela


----------



## SlaterB (25. Nov 2008)

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


----------

