【发布时间】:2013-06-07 03:54:16
【问题描述】:
我正在尝试使用 JPA Criteria API 实现以下目标:
SELECT b FROM Box b JOIN SpecialItem s WHERE s.specialAttr = :specialAttr
对象是
盒子
@Entity
public class Box implements Serializable {
...
@ManyToOne
@JoinColumn( name = "item_id" )
Item item;
...
}
物品
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public class Item implements Serializable {
@Id
private String id;
...
}
特殊物品
@Entity
public class SpecialItem extends Item {
private String specialAttr;
...
}
我的尝试
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 );
毫不奇怪,它会引发异常,因为 specialAttr 不是 Item 类的成员。
如何返回所有包含SpecialItem 的Boxes,其中SpecialItem.specialAttr 有一些价值?
【问题讨论】:
-
我的问题是如何返回包含
SpecialItemTOO 的Boxes?很高兴收到您的来信。
标签: jpa criteria-api