que tiene una estructura de clases como esto:JPA los criterios del API: propiedades de la consulta de la subclase
@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;
}
He intentado lo siguiente para recibir toda CartItems
que tiene una referencia a un Book
con 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();
Pero desafortunadamente, esto produce un error (tiene sentido para mí, ya que title
está en Book
, no en 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) ...
Sin embargo, yo era capaz de lograr lo que quiero utilizando la siguiente HQL:
SELECT c, a FROM CartItem c INNER JOIN c.article a WHERE a.title = ?
Entonces, ¿por qué este último trabajo y puedo lograr algo similar utilizando la API de criterios?
¿No le falta 'builder.select (root)'? Además, su consulta de criterios no se corresponde con la consulta JPQL. –
¡Gracias por tu comentario! Hmm, mi 'constructor' (de' hibernate-jpa-2.0-api-1.0.0.Final.jar') no tiene un método 'select()'. Sí, no se corresponden porque me falta algo obviamente ;-) ¿Estás diciendo que tendría que agregar el JOIN al 'Article' por mí mismo? – msonntag