我正在尝试使用JPA Criteria API实现以下类似的功能:
SELECT b FROM Box b JOIN SpecialItem s WHERE s.specialAttr = :specialAttr
Run Code Online (Sandbox Code Playgroud)
对象是
框
@Entity
public class Box implements Serializable {
...
@ManyToOne
@JoinColumn( name = "item_id" )
Item item;
...
}
Run Code Online (Sandbox Code Playgroud)
项目
@Entity
@Inheritance( strategy = InheritanceType.JOINED )
public class Item implements Serializable {
@Id
private String id;
...
}
Run Code Online (Sandbox Code Playgroud)
SpecialItem
@Entity
public class SpecialItem extends Item {
private String specialAttr;
...
}
Run Code Online (Sandbox Code Playgroud)
我的尝试
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 );
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,它会抛出异常,因为specialAttr不是类Item的成员.
如何返回Box包含a的所有es SpecialItem,哪里SpecialItem.specialAttr有一些值?
Chr*_*ris 14
如果使用JPA 2.1,您可以使用
"SELECT b FROM Box b WHERE TREAT(b.item as SpecialItem).specialAttr = :specialAttr"
Run Code Online (Sandbox Code Playgroud)
要么
CriteriaQuery<Box> q = cb.createQuery(Box.class);
Root<Box> box= q.from(Box.class);
Join<Box, Item > order = box.join("item");
q.where(cb.equal(cb.treat(order, SpecialItem.class).get("specialAttr"),
qb.parameter(String.class, "specialAttr")));
q.select(Box);
Run Code Online (Sandbox Code Playgroud)
我只想用生成的元模型扩展Chris对Criteria API的回答。
CriteriaQuery<Box> q = cb.createQuery(Box.class);
Root<Box> box= q.from(Box.class);
Join<Box, Item> order = box.join(Box_.item);
q.where(cb.equal(cb.treat(order, SpecialItem.class).get(SpecialItem_.specialAttr), "searchValue");
q.select(Box);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6024 次 |
| 最近记录: |