tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1174
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    pizza1234 pizza1234 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Beiträge
    177
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
            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 :
    1
    2
    3
    4
    5
    6
    7
    8
    
            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
     

  2. #2
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    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ß
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  3. #3
    pizza1234 pizza1234 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Beiträge
    177
    Gute Idee mit dem statischen Import! Ansonsten sind die Zauberwörter "disjunction" und "conjunction".

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

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
            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
     

Ähnliche Themen

  1. Criteria: zwei criteria Objekte "oder-verknüpfen"?
    Von RoCMe im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 25.05.10, 17:31
  2. Hibernate Criteria-Abfrage über mehrere Objekte
    Von pizza1234 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 18.03.10, 10:02
  3. Hibernate Criteria Javassist
    Von langmar im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 6
    Letzter Beitrag: 27.08.09, 18:05
  4. Fehler bei Hibernate Abfrage mit Criteria
    Von toroe im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 07.07.09, 10:29
  5. Spring und Hibernate (Criteria & Query by Example) problem
    Von catarina im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 2
    Letzter Beitrag: 07.04.09, 14:42