1
我試着去我的查詢與子查詢的幫助下進行排序,但總是得到JPA 2.1標準API:在排序依據使用子查詢
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node
例如
@Entity
@Table
public class Product extends AbstractEntity {
@OneToMany(mappedBy = "product")
private List<Item> items = new ArrayList<>();
}
@Entity
public class Item extends AbstractEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
private Product product;
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "delivery_date")
private DateTime deliveryDate;
}
我想查詢所有產品,並通過其項目的最早deliveryDate結果。我建立了查詢,如下所示:
CriteriaBuilder builder = manager.getCriteriaBuilder();
CriteriaQuery<Product> query = builder.createQuery(Product.class);
Root<Product> product = query.from(Product.class);
Subquery<DateTime> deliveryDateSQ = query.subquery(DateTime.class);
Root<Item> itemsFrom = deliveryDateSQ.from(Item.class);
deliveryDateSQ.select(
criteriaBuilder.least(itemsFrom.get(Item_.deliveryDate)));
deliveryDateSQ.where(
criteriaBuilder.equal(itemsFrom.get(Item_.product), product));
query.orderBy(criteriaBuilder.asc(deliveryDateSQ));
TypedQuery<Product> typedQuery = manager.createQuery(query);
在執行查詢我總是得到以下錯誤:
antlr.NoViableAltException: unexpected AST node: query
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderExpr(HqlSqlBaseWalker.java:1836) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderExprs(HqlSqlBaseWalker.java:1627) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.orderClause(HqlSqlBaseWalker.java:1603) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:642) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:249) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
而一些更細節從春:
org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: query [...]
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:381)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:216)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
有沒有一種辦法以某種方式改變查詢,使其按預期工作?
感謝您的任何幫助。
但是,這隻命令產品內的項目。我想要做的是通過他們物品的收貨delivery_date來訂購所有產品。 – Psalchow