2015-10-26 3 views
1

Im пытаясь отсортировать мой запрос с помощью подзапроса, но всегда получитьJPA 2.1 Критерии API: Использование подзапросы в OrderBy

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; 
} 

Я хотел бы запросить все продукты и заказать результат по самой ранней доставке. Я создаю запрос следующим образом:

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

Но это заказывает только предметы внутри продукта. То, что я хочу сделать, - это упорядочить все продукты с помощью earlies delivery_date своих товаров. – Psalchow

Смежные вопросы