2012-03-26 13 views
5

Ich versuche, eine Abfrage zu schreiben, um ein Unterklassenattribut zu suchen, das nicht in seiner Oberklasse ist und alle Objekte der Oberklasse zurückgibt. Momentan erhalte ich eine NullPointerException, wenn ich person.get ("specialAttribute") versuche und mache.Wie nach Subklassenattribut mit einem JPA CriteriaQuery suchen?

@Inheritance(strategy = InheritanceType.JOINED) 
@Entity 
public abstract class Person { 
    public String searchableAttribute; 
} 

@Entity 
@Table(name = "normal_person") 
public class NormalPerson extends Person { 

} 

@Entity 
@Table(name = "special_person") 
public class SpecialPerson extends Person { 
    @Column(nullable = false, unique = true) 
    public String specialAttribute; 
} 

// Controller method 

    Root<Person> person = query.from(Person.class); 
    query.where(
      builder.or(
        builder.like(person.<String>get("specialAttribute"), "foo"), 
        builder.like(person.<String>get("searchableAttribute"), "foo") 
      ) 
    ); 

Antwort

9

Gelöst mein eigenes Problem nach einem Hinweis zur Verfügung gestellt here.

Root<Person> person = query.from(Person.class); 

Subquery<SpecialPerson> subQuery = query.subquery(SpecialPerson.class); 
Root<SpecialPerson> specialPersonRoot = subQuery.from(SpecialPerson.class); 

subQuery.select(specialPersonRoot); 
subQuery.where(builder.like(specialPersonRoot.<String>get("specialAttribute"), "foo")); 

query.where(
     builder.or(
       builder.in(person).value(subQuery) 
       builder.like(person.<String>get("searchableAttribute"), "foo") 
     ) 
);