2011-08-01 110 views
9

的查詢屬性我有一個類的結構是這樣的: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; 
} 

我嘗試以下,以接收有一Booktitle = '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(); 

但不幸的是,這會導致錯誤(對我來說很有意義,因爲titleBook中,而不是在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,我可以實現類似的東西?

+0

是不是缺少'builder.select(root)'?另外,您的條件查詢不符合JPQL查詢。 –

+0

感謝您的評論!嗯,我的'builder'(來自'hibernate-jpa-2.0-api-1.0.0.Final.jar')沒有'select()'方法。是的,他們不相符,因爲我很明顯缺少;-)你是說我必須自己添加JOIN到'Article'嗎? – msonntag

回答

1

我不是專家,但從OO的角度來看,我會說一篇文章沒有財產標題,因此在CarItem的屬性文章中找不到。

也許你應該檢查文章的類型是書。

我不知道如何使用CriteriaBuilder

Criteria c=session.createCriteria(CarItem.class, "caritem"); 
c.add(Restrictions.eq("caritem.class", Book.class)); 
List<Article> list=c.list(); 
1

我有同樣的問題和解決方案由於發現chris(見JPA Criteria API where subclass)來做到這一點。

爲此,您需要JPA 2.1,並使用CriteriaBuilder.treat()方法之一。只需將builder.equal...行替換爲:

builder.equal(builder.treat(root.get("article"), Book.class).get("title"), "Foo"); 
+0

工作就像一個魅力:) – wuerg