# Problem Oder-Verknüpfung Hibernate-Criteria



## pizza1234 (8. April 2009)

Hi,
ich versuche eine SQL-Query so umzubauen, das ich die Criteria-API von Hibernate dazu benutzen kann. Mein Problem ist,das ich irgendwie keine mehrfachen Or-Querys hinbekomme. Geht das überhaupt?

Hier der SQl-Query:

```
createSQLQuery("Select {privateAddresses.*} from private_addresses {privateAddresses} " +
																	"where affiliate_id = "+id.intValue()+
																	" and (name like '"+search+"' " +
																	" or city like '"+ search+"' " +
																	" or street like '"+ search+"' " +
																	" or email like '"+ search+"' " +
																	" or url like '"+ search+"' " +
																	" or zipcode like '"+search+ "')" ).addEntity("privateAddresses",PrivateAddresses.class).list();
```

und hier mein Criteria-Versuch, der leider so nicht funktioniert:

```
DetachedCriteria crit = DetachedCriteria.forClass(PrivateAddresses.class);
		crit.add(Restrictions.and(Restrictions.eq("affiliateId", id.intValue()),
									Restrictions.or(
												Restrictions.like("name", search),
												Restrictions.like("street", search),
												Restrictions.like("email", search),
												Restrictions.like("url", search),
												Restrictions.like("zipcode", search),
												Restrictions.like("city", search)
												  )
									)
					);
```

(Entschuldigt die Formatierung, aber ich hab den Code aus Eclipse kopiert und da sieht er vernünftig aus.)

Folgender Code mit nur 2 -Or-Verknüpfungen funktioniert, löst aber nicht mein Problem:


```
crit.add(Restrictions.and(Restrictions.eq("affiliateId", id.intValue()),
									Restrictions.or(
												Restrictions.like("name", search),
												Restrictions.like("street", search)
			
												  )
									)
					);
```


Vielleicht wißt ihr ja eine Lösung, bzw. würdet ihr überhaupt mit der Criteria-API arbeiten oder doch lieber mit HQL/SQL? Benutzt wird das Ganze übrigens für eine Suchmaske!

Grüße,
Peter


----------



## Oliver Gierke (8. April 2009)

Nur eine Vermutung: kann es sein, dass du mehrere ORs durch mehrere Restrictions.or angeben musst und nicht alle Kriterien in ein .or? Zumindest sieht das so etwas unnatürlich aus 

Btw. ein static import von Restrictions.* würde den Code wesentlich übersichtlicher machen.

Gruß


----------



## pizza1234 (8. April 2009)

Gute Idee mit dem statischen Import! Ansonsten sind die Zauberwörter "disjunction" und "conjunction".

Hier die funktionierende und einigermaßen lesbare Lösung:


```
Criteria crit 	= getSession().createCriteria(PrivateAddresses.class);
		Disjunction or 	= disjunction();
		or.add(like("name", search,MatchMode.START))
		.add(like("address.street", search,MatchMode.START))
		.add(like("telecommunication.email", search,MatchMode.START))
		.add(like("telecommunication.url", search,MatchMode.START))
		.add(like("address.zipcode", search,MatchMode.START))
		.add(like("address.city", search,MatchMode.START));
		
		Conjunction and = conjunction();
		and.add(eq("affiliateId", id.intValue()))
		.add(or);
	
		crit.add(and);
```

Grüße,
Peter


----------

