Hibernate - AND und OR in Abfrage verknüpfen

Kryptaesthesie

Erfahrenes Mitglied
Hibernate - zwei Tabellenspalten für WHERE zusammenfügen - wie?

Guten Tag,

ich möchte gerne mit Hibernate ein AND und ein OR verknüpfen.
Aufbau: a ODER (b UND c)

So in etwa :)

Ich habe es mit folgendem Code versucht, aber da wird immer nur die eine Bedingung ausgeführt. Die UND-Verknüpfung bleibt unangetastet. Seht ihr den Fehler?

Code:
			Criteria crit = getSession().createCriteria(User.class);
			
			Criterion critUsername = Restrictions.ilike("username", squery);
			
			Criterion critForename = Restrictions.ilike("forename", squery);
			Criterion critSurname = Restrictions.ilike("surname", squery);
			LogicalExpression andExprName = Restrictions.and(critForename, critSurname);
			
			// Kriterium für Username und Name mit OR verknüpfen
			LogicalExpression orExp = Restrictions.or(critUsername, andExprName);
			
			crit.add(orExp);
			crit.addOrder(Order.asc("forename"));
			List<User> user = crit.list();

			return user;

Also nach Username abfragen funktioniert, aber wenn ich nach Vor- u. Nachname abfrage, dann kommt eine leere Liste zurück.

EDIT:
Okay, den Denkfehler habe ich gefunden, das Problem aber noch nicht gelöst!
in dem OR-Zweig, wo die beiden Bedingungen verknüpft werden, da müssen die Tabellenspalten forename und surname zusammen mit dem Suchbegriff abgefragt werden!
So könnte ein fertiger SQL-Befehl aussehen:
Code:
select
    USER_ID,
    username,
    forename,
    surname,
    active 
from
    USERS
where
    (
        username = 'Rainer Nonsens'
        or (
            (forename || ' ' || surname) = 'Rainer Nonsens'
        )
    )

Ziel soll es sein, dass entweder nach dem Usernamen, oder nach Vor- u. Nachname gesucht werden kann.
Wie setze ich das in Hibernate um?

Danke schon mal für eure Hilfe! :)
Gruß
Gerrit
 
Zuletzt bearbeitet:
Ich habe das jetzt folgendermaßen gemacht und es scheint zu funktionieren:

Ich habe der Userklasse eine weitere Propertie hinzugefügt:
<property name="fullname" formula="forename || ' ' || surname"/>

In der Suche greife ich dann auf diese Propertie zu:
Code:
			Criteria crit = getSession().createCriteria(User.class);
			Criterion critUsername = Restrictions.ilike("username", "" + squery + "");
			Criterion critFullname = Restrictions.ilike("fullname", "" + squery + "");
			
			// Kriterium für Username und Name mit OR verknüpfen
			LogicalExpression orExp = Restrictions.or(critUsername, critFullname);
			crit.add(orExp);
			crit.addOrder(Order.asc("forename"));
			
			List<User> user = crit.list();
			return user;


Es scheint zu funktionieren ...! :)
 

Neue Beiträge

Zurück