mam struktura klasy tak:JPA Criteria API: nieruchomość zapytań od podklasy
@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;
}
Próbowałem następujących czynności, aby otrzymywać wszystkie CartItems
które mają odniesienie do Book
z 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();
Ale niestety powoduje to błąd (ma to sens dla mnie, ponieważ title
jest w Book
, a nie w 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) ...
Jednak udało mi się osiągnąć to, co chcę używając następującej HQL:
SELECT c, a FROM CartItem c INNER JOIN c.article a WHERE a.title = ?
Więc dlaczego ostatnia praca i mogę osiągnąć coś podobnego przy użyciu API kryteria?
Nie brakuje Ci 'builder.select (root)'? Ponadto zapytanie o kryteria nie odpowiada kwerendie JPQL. –
Dzięki za komentarz! Hmm, mój 'builder' (z' hibernacji-jpa-2.0-api-1.0.0.Final.jar') nie ma metody 'select()'. Tak, nie odpowiadają, oczywiście, że bardzo mi brakuje ;-) Czy chcesz dodać JOIN do 'Artykułu' na własną rękę? – msonntag