Jak odwołać się do specyficznego pola podklasy w zapytaniu o kryteria, w którym pytana jest super klasa?

Próbuję osiągnąć coś takiego, korzystając z interfejsu API kryteriów Kryteria JPA:

SELECT b FROM Box b JOIN SpecialItem s WHERE s.specialAttr = :specialAttr

Obiekty są

Pudełko

@Entity
public class Box implements Serializable {
  ...
  @ManyToOne
  @JoinColumn( name = "item_id" )
  Item item;
  ...
}

Pozycja

@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public class Item implements Serializable {
  @Id
  private String id;
  ...
}

Specjalny przedmiot

@Entity
public class SpecialItem extends Item {
  private String specialAttr;
  ...
}

Moja próba

EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery( Box.class );
Root from = cq.from( Box.class );

// Nothing to specify SpecialItem over Item!      
Join join = from.join("item", JoinType.LEFT);

// java.lang.IllegalArgumentException: Unable to 
// resolve attribute [specialAttr] against path [null]      
Path p = join.get( "specialAttr" );

Predicate predicate = cb.equal( p, "specialValue" );
cq.where( predicate );

Nic dziwnego, że zgłasza wyjątek, ponieważ specialAttr nie jest członkiem klasy Item.

Jak mogę zwrócić wszystkieBoxes, które zawierająSpecialItem, gdzieSpecialItem.specialAttr ma jakąś wartość?

questionAnswers(2)

yourAnswerToTheQuestion