Problem Oder-Verknüpfung Hibernate-Criteria

pizza1234

Erfahrenes Mitglied
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:
Code:
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:
Code:
		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:

Code:
		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
 
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ß
 
Gute Idee mit dem statischen Import! Ansonsten sind die Zauberwörter "disjunction" und "conjunction".

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

Code:
		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
 

Neue Beiträge

Zurück