【发布时间】:2011-10-17 17:48:21
【问题描述】:
我有一个这样的类结构:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Article {
private String aBaseProperty;
}
@Entity
public class Book extends Article {
private String title;
}
@Entity
public class CartItem {
@ManyToOne(optional = false)
public Article article;
}
我尝试了以下方法来接收所有引用Book 和title = 'Foo' 的CartItems:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<CartItem> query = builder.createQuery(CartItem.class);
Root<CartItem> root = query.from(CartItem.class);
builder.equal(root.get("article").get("title"), "Foo");
List<CartItem> result = em().createQuery(query).getResultList();
但不幸的是,这会导致错误(对我来说很有意义,因为 title 在 Book 中,而不是在 Article...):
但是,我能够使用以下 HQL 实现我想要的:
SELECT c, a FROM CartItem c INNER JOIN c.article a WHERE a.title = ?
那么为什么后者会起作用,我可以使用 Criteria API 实现类似的效果吗?
【问题讨论】:
-
你不缺
builder.select(root)吗?另外,您的条件查询与 JPQL 查询不对应。 -
感谢您的评论!嗯,我的
builder(来自hibernate-jpa-2.0-api-1.0.0.Final.jar)没有select()方法。是的,它们不对应,因为我显然错过了某事;-) 你是说我必须自己将 JOIN 添加到Article吗?
标签: sql hibernate jpa polymorphism criteria