2012-03-28 11 views
3

muss ich Kriterien oder Criterion auf bestimmten Feld myProperity (auf Klasse MyClass) erstellen erstellen. Ich muss alle Objekte wählen, die prop = null haben oder spezifische Kriterien erfüllen. Also sollte ich so etwas wie machen:Wie erstellt man Kriterien für ein Feld, das null sein kann?

Criteria criteria = this.sessionManager.getCurrentSession().createCriteria(MyClass.class); 

specificCriteria = criteria.createCriteria('myProperity'); 
/* definition of specificCriteria */ 

Disjunction disjunction = Restrictions.disjunction(); 
disjunction.add(Restrictions.isNull('myProperity')); 
disjunction.add(specificCriteria); 

criteria.add(disjunction); 

Das Problem verursacht wird, werden die Fakten:

  1. ich nicht Kriterien zu Disjunction hinzufügen können (bis Disjunction kann nur ein Kriterium hinzugefügt werden), so line: disjunction.add (specificCriteria); ist falsch
  2. Ich kann nicht irgendwie die spezifischeCriteria ändern, um Null zu akzeptieren, weil ich Kriterien auf null nicht machen kann. (Es gibt mir NullPointerException)

Haben Sie irgendeine Idee, wie man damit umgeht?

+0

Eine Disjunktion ist ein Kriterium, also können Sie es zu einem Kriterium hinzufügen. –

+0

Ja, ich habe eine Zeile verfehlt: criteria.add (disjunction); aber es ist nicht der Fall. – M314

+0

das Problem ist, dass ich nicht hinzufügen kann Kriterien disjunction: disjunction.add (specificCriteria); – M314

Antwort

6

Sie können hier Antwort aller Fragen erhalten dieses Sie

für ex helfen, wenn Ihr MyClass wie

class MyClass{ 
    private long id; 
    private String myProperity; 
    . 
    . 
    . 
    setter & getter 
} 

hier Sie null Problem gelöst wird, und diese werden mit anderen Kriterien oring.

Criteria criteria = session.createCriteria(MyClass.class); 

Disjunction disjunction = Restrictions.disjunction(); 
disjunction.add(Restrictions.isNull("myProperity")); 

criteria.add(disjunction); 

criteria.add(Restrictions.eq("id", value)); 
2

So etwas hat mir geholfen:

final Criteria c = session.createCriteria(House.class) 
    // Houses may not have doors. 
    .createAlias("door", "door", CriteriaSpecification.LEFT_JOIN) 
    // Door may be null, but if it isn't it must be blue. 
    .add(Restrictions.or(Restrictions.isNull("door"), Restrictions.eq("door.color", "blue"))); 

Diese Antwort hat mir geholfen: https://stackoverflow.com/a/2208458

+0

Danke !!! Du hast mich gerettet! – FlokiTheFisherman

5

Nur für alle anderen mit dieser Frage. Ich hatte ein ähnliches Problem, bei dem ich prüfen wollte, ob eine zugehörige Sammlung leer und wenn nicht durch ID beschränkt war. Um dies zu erreichen, wird die folgende half mir (aktualisierten Code für neuere Version von Hibernate):

Criteria criteria = getSession().createCriteria(StaffMember.class); 
criteria.createAlias("franchises", "franchises", JoinType.LEFT_OUTER_JOIN) 
     .add(Restrictions.or(
       Restrictions.isEmpty("franchises"), 
       Restrictions.in("franchises.id", allowedFranchises))); 

So ermöglicht dies die folgenden:

  1. Mitarbeiter ohne Franchise
  2. Mitarbeiter, die in ein Franchise mit einer ID von allowedFranchises collection