# Hibernate + ilike



## Gast (19. Sep 2007)

Hallo, 

habe folgendes Problem. Ich arbeite mit Ecplipse auf einer Postgres DB und habe Hibernate als vermittlungsschicht eingesetzt. Da Hibernate mit reinen Objekten arbeitet, wird die groß- und kleinschreibung bei HQL (Hibernate Query Language) berücksichtigt. Habe mich versucht mit diesem Problem zu beschäftigen, und habe auch eine Lösung gefunden. Die Lösung ist eine HQL abfrage mit ilike gestallten. Aber genau da fängt mein Problem an da ich nicht weiß wie diese gestaltet wird. 

Meine Methode sieht so aus:

public List<Firma> getFirmaNachSuchwort(String suchwort) {
		Transaction tx = session.beginTransaction();
		Query q = session.createQuery("from Firma as firma where " +
		"firma.name like '%"+ suchwort + "%' or " +
		"firma.code like '%"+ suchwort + "%' or " +
		"firma.debitorenNr like '%"+ suchwort + "%' and " +
		"firma.del=false");

List<Firma> ergebnis = q.list();
tx.commit();
return ergebnis;}

Eine Methode die ich gefunden habe, aber leider nicht funktioniert sieht so aus:

   Criteria entryCriteria = session.createCriteria(Firma.class);
        entryCriteria.add(Restrictions.eq("blogId", blog.getId()));
        entryCriteria.add(Restrictions.or(Restrictions.ilike("title", query, MatchMode.ANYWHERE),
        Restrictions.ilike("description", query, MatchMode.ANYWHERE)))
        .add(Restrictions.eq("status", BlojsomMetaDataConstants.PUBLISHED_STATUS));
        entryCriteria.addOrder(Order.desc("date"));
        entryCriteria.setCacheable(true);
        List entryList = entryCriteria.list();
        tx.commit();
        session.close();

geht diese?? Das umschreiben der Abfrage hat leider nicht funktioniert!!!! Kann mir jemand helfen wie eine ilike Abfrage gestaltet wird????


----------



## ms (19. Sep 2007)

Was ist das konkrete Problem?
Nicht compilierbar?
Exception?
Falsches Ergebnis?

ms


----------



## Gast (19. Sep 2007)

die abfrage funktioniert nicht!!!! Und ich weiß nicht wieso????

Die Methode die ich geschrieben haben gibt mir alle Werte zurück die zuvor in ein Textfeld geschrieben habe!!!!

Ich Suche z.B nach den Namen "Werner". Diesen Namen muss ich dann auch genauso eingeben damit dieser gefunden wird also "Werner" ich möchte aber hingehen den Namen "Werner" nur in kleinbuchstaben eingeben also "werner". Da aber Hibernate mit Objekten arbeitet unterscheidet es die Groß und Kleinschreibung und kann den Namen, wenn er nur mit kleinbuchstaben eingegeben wurde nicht finden. Dies ist leider bischen anders als im normalen SQL da Hibernate dieses unterscheidet. 

Habe sehr viel gelesen und bin dann darauf gekommen das es für Hibernate die Abfrage "ilike" gibt diese soll genau mein Problem lösen. Ich habe aber leider kein vernüftiges beispiel gefunden welches mir weiterhilft!!!!! Deshalb die frage ob mir jemand weiterhelfen kann meine Methode so zu schreiben oder mir ein bsp. zu geben wie diese mit "ilike" aussehen würde??!!


----------



## maki (19. Sep 2007)

> Ich Suche z.B nach den Namen "Werner". Diesen Namen muss ich dann auch genauso eingeben damit dieser gefunden wird also "Werner" ich möchte aber hingehen den Namen "Werner" nur in kleinbuchstaben eingeben also "werner". Da aber Hibernate mit Objekten arbeitet unterscheidet es die Groß und Kleinschreibung und kann den Namen, wenn er nur mit kleinbuchstaben eingegeben wurde nicht finden. Dies ist leider bischen anders als im normalen SQL da Hibernate dieses unterscheidet.


Wie kommst du darauf?

Hibernate ist nur case-sensitive, wenn es um Java Klassen und deren Properties geht.

http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html


----------



## Gast (19. Sep 2007)

und wieso gibt er mir dann kein Werte mit kleinbuchstaben aus???? Und wieso gibt es dann "ilike" für Hibernate????


----------



## maki (19. Sep 2007)

Hmm.. hab gerade ein bischen gestestet, keine Ahnung wie ilike funktioniert, aber wenn ich dem Suchstring ein % anhänge, ignoriert er den case.


----------



## ms (19. Sep 2007)

Das Hibernate bei Klassen und Properties case sensitiv ist hat mit deinem Problem nichts zu tun.

Habs gerade getestet.
Bei den Criterias funktioniert es.
In einem HQL-Statement kennt hibernate anscheinend kein 'ilike'.
Hab dazu auch nichts in der dokumentation gefunden.

```
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ilike near line 1, column 52 [from com.ms.model.Firma as firma where firma.title ilike '%Werner%' ]
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:244)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:155)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
	at com.ms.test.IlikeTestcase.getFirmaNachSuchwort(IlikeTestcase.java:55)
	at com.ms.test.IlikeTestcase.testIlike(IlikeTestcase.java:47)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at junit.framework.TestCase.runTest(TestCase.java:154)
	at junit.framework.TestCase.runBare(TestCase.java:127)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:118)
	at junit.framework.TestSuite.runTest(TestSuite.java:208)
	at junit.framework.TestSuite.run(TestSuite.java:203)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: line 1:52: unexpected token: ilike
	at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3504)
	at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3200)
	at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3082)
	at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2802)
	at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:570)
	at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2586)
	at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2449)
	at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2413)
	at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2331)
	at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2296)
	at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:2082)
	at org.hibernate.hql.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1858)
	at org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:454)
	at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:708)
	at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:296)
	at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:159)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:238)
	... 28 more
```

Ein anderer Weg um es in einer HQL zu lösen wäre

```
upper(firma.title) like '%" + suchwort.toUpperCase() + "%'
```

ms


----------



## maki (19. Sep 2007)

ms,

bei mir reicht es, wenn es so formuliert wird:

like 'SuchTeXT*%*'


----------



## ms (19. Sep 2007)

maki hat gesagt.:
			
		

> like 'SuchTeXT*%*'


liefert dir 'suchtext' und 'SuchTeXT'???

Kann ich nicht glauben, ich habs gerade nochmal getestet.
Like in PostgreSQL ist definitiv case sensitiv (siehe hier)
Welche Db verwendest du?

ms


----------



## maki (19. Sep 2007)

> Like in PostgreSQL ist definitiv case sensitiv (siehe hier)


Stimmt, ihr habt da beide Recht und ich hab mich geirt.



> liefert dir 'suchtext' und 'SuchTeXT'???


Ja, definitiv.
Ich verwende MySQL (ISAM).
MySQL scheint ein like ohne platzhalter einfach als = zu interpretieren..

Hab gerade auf dem MS SQL Server ein (normales) SQL statement mit like abgesetzt, 
da braucht man gar kein %, ist immer case-insensitive...
mir scheint, als ob meine Applikation nicht ohne weiteres zu 100% von DB zu DB portierbar wäre, trotz Hibernate.

Nachtrag:
MySQL ist normalerweise nicht case-sensitive: http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html
kann man aber umschalten, für den MS SQL Server gilt dasselbe.


----------



## ms (19. Sep 2007)

Das *%* hat aber nichts mit case sensitiv zu tun.
'Werner%' würde auch 'Werner Beinhart' zurückliefern.

Ja, ich hab auch schon gelesen, dass Like bei MySQL nicht case sensitiv ist, konnte aber auf die schnelle keinen Link zur Dokumentation finden.

ms


----------

