2015-10-26 57 views
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) 

有沒有一種辦法以某種方式改變查詢,使其按預期工作?

感謝您的任何幫助。

回答

0

我們可以使用@OrderBy(clause =「delivery_date ASC」) Hibernate子句。

所以你的模型可以是這樣的。

@Entity 
@Table 
public class Product extends AbstractEntity { 
    @OrderBy(clause = "delivery_date ASC") 
    @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; 
} 
+0

但是,這隻命令產品內的項目。我想要做的是通過他們物品的收貨delivery_date來訂購所有產品。 – Psalchow