2017-11-29 10 views
0

ich ein Objekt haben, nennen wir es Person:Kann ich ein Objekt als Prädikat für die Kriterienabfrage in JPA verwenden, wenn einige Felder NULL sein können?

@Entity 
@Table(name = "PERSON") 
public class Person extends PersistentObject { 

    @Id 
    @Column(name = "NAME") 
    private String name; 

    @Column(name = "AGE") 
    private String age; 

    @Column(name = "NICKNAME") 
    private String nickname; 

    @Column(name = "HAIR_COLOR") 
     private String hairColor; 
. 
. 
. 

Ich möchte auf einem CriteriaQuery dieses Objekt als Filter verwenden Prädikate verwenden, aber wenn ein Teil des Eingangs Obj NULL ist (zB Rufname) Es bricht die Abfrage. Hier ist ein Beispiel für den Code, den ich gerade habe.

Ist es möglich, ein Objekt als Filter zu verwenden, wenn die Objektwerte nicht immer gleich sind?

Beispiel Eingabe: [{ "name": "Bob", "Alter": "30"}, { "name": "William", "Nickname": "Bill"}]

In diesem Beispiel mag ich jede Person in der Person Tisch bekommen, wo: die Personen Name Bob ist und das Alter ist 30 oder die Personen Name ist William und der Spitzname ist Bill

Sorry, wenn dieses Beispiel ein wenig unklar ist, Ich habe den Code geändert, um es so einfach wie möglich zu machen, in andere Beispiele zu übersetzen. Mein Wissen über JPA im Allgemeinen ist grundlegend, im besten Fall selbstständig (Lesen, Google) in den letzten Monaten. Jede Hilfe mit diesem würde sehr geschätzt werden. Vielen Dank!!

+0

Was ist "Darstellung" hier? –

+0

@KalaiselvanA Entschuldigung, meine Schuld. Ich habe nicht meinen gesamten ursprünglichen Code geändert. Aus Gründen der Vertraulichkeit habe ich den genauen Code geändert und mein Objekt durch ein Beispielobjekt "Person" ersetzt. Ich habe es behoben, danke! – user2867999

Antwort

0

Von dem, was Sie sagen Sie wollen ein Kriterium angewandt werden, wenn die entsprechende Eigenschaft der Bohne ist nicht null und nicht angewendet werden, wenn die Eigenschaft null ist. Dafür müssen Sie eine Liste erstellen und dann in ein Array umwandeln als Argument and() geben (so wie du mit List<Predicate> predicates tun):

for(Person person : peopleToGet) { 
    List<Predicate> andPredicates = new ArrayList<>(); 

    if(person.getName() != null) andPredicates.add(cb.equal(e.get("name"), person.getName())); 
    if(/* similar code for the other properties */) /* ... */; 

    predicates.add(cb.or(cb.and(andPredicates.toArray(new Predicate[andPredicates.size()])))); 
} 

Der obigen Code, dass nicht alle Eigenschaften von Person geht davon sind null ! Wenn das der Fall ist, müssen Sie sich davor schützen!

+0

oh ich sehe .... Danke! Ich werde das testen und die Frage mit den Ergebnissen aktualisieren. – user2867999

+0

Das war genau das, wonach ich suchte. Dies gibt mir eine viel vielseitigere Möglichkeit, meine Daten aus der DB zu bekommen, was mir erlaubt, in einigen Dingen spezifisch zu sein und in anderen sehr breit zu sein. Vielen Dank!! – user2867999

Verwandte Themen