的查詢屬性我有一個類的結構是這樣的:JPA標準API:子類
@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
中):
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 = ?
那麼,爲什麼後面的工作,並使用標準的API,我可以實現類似的東西?
是不是缺少'builder.select(root)'?另外,您的條件查詢不符合JPQL查詢。 –
感謝您的評論!嗯,我的'builder'(來自'hibernate-jpa-2.0-api-1.0.0.Final.jar')沒有'select()'方法。是的,他們不相符,因爲我很明顯缺少;-)你是說我必須自己添加JOIN到'Article'嗎? – msonntag