2012-03-26 9 views
5

Tôi đang cố viết một truy vấn để tìm kiếm một thuộc tính lớp con không có trong lớp cha của nó và trả về tất cả các đối tượng của lớp cha. Hiện tại tôi đang nhận được một NullPointerException khi tôi cố gắng và làm person.get ("specialAttribute").Làm thế nào để tìm kiếm trên thuộc tính lớp con với một JPA CriteriaQuery?

@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") 
      ) 
    ); 

Trả lời

9

Giải quyết vấn đề của riêng tôi theo gợi ý được cung cấp 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") 
     ) 
);