mso*_*tag 9 sql polymorphism hibernate jpa criteria
我有这样的类结构:
@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;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容来接收所有CartItems引用a Book的内容title = 'Foo':
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();
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这将导致错误(对我来说很有意义,因为title是Book,在不Article...):
java.lang.IllegalArgumentException: Could not resolve attribute named title
at org.hibernate.ejb.criteria.path.SingularAttributePath.locateAttributeInternal(SingularAttributePath.java:101)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:216)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:189)
...
但是,我能够使用以下HQL实现我想要的:
SELECT c, a FROM CartItem c INNER JOIN c.article a WHERE a.title = ?
Run Code Online (Sandbox Code Playgroud)
那么为什么后者可以工作呢?我可以使用Criteria API实现类似的功能吗?
我不是专家,但从面向对象的角度来看,我会说文章没有属性标题,因此在 CarItem 的名为 Article 的属性中找不到。
也许您应该检查文章是否属于书籍类型。
我不知道如何使用 CriteriaBuilder 来做到这一点
Criteria c=session.createCriteria(CarItem.class, "caritem");
c.add(Restrictions.eq("caritem.class", Book.class));
List<Article> list=c.list();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6081 次 |
| 最近记录: |