2015-03-09 2 views
0

Привет, сообщество StackOverflow,Как сделать правильное соединение HQL

У меня возникают проблемы с запросом HQL. Для финансового приложения мы хотим получить объект TradeTicket на основе данного объекта StrategyInstrument. Вот определенные объекты (подробности опущены, показаны только отношения).

@Entity 
public class Trade { 
    @ManyToOne 
    private Ticket ticket; 

    @ManyToOne 
    private Order buyOrder; 

    @ManyToOne 
    private Order sellOrder; 
    ... 
} 

@Entity 
public class TradeTicket { 
    private Date modifiedDateTime; 
    ... 
} 

@Entity 
public class Order { 
    @OneToOne 
    private StrategyInstrument strategyInstrument; 
    ... 
} 

@Entity 
public class StrategyInstrument { 
    ... 
} 

И я пытаюсь следующий запрос:

String queryString = "select ticket from TradeTicket ticket" 
    + " join Trade trade" 
    + " join Order order" 
    + " where trade.tradeTicket = ticket" 
    + " and (trade.buyOrder = order or trade.sellOrder = order)" 
    + " and order.strategyInstrument = :strategyInstrument" 
    + " and ticket.clearingApproval.approved = true" 
    + " order by ticket.modifiedDateTime"; 
List<TradeTicket> results = getSession() 
    .createQuery(queryString) 
    .setParameter("strategyInstrument", strategyInstrument) 
    .list(); 

что приводит к следующим исключением:

Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: Order near line 1, column 102 [select ticket from com.mycompany.model.transactional.TradeTicket ticket join Trade trade join Order order where trade.tradeTicket = ticket and (trade.buyOrder = order or trade.sellOrder = order) and order.strategyInstrument = :strategyInstrument and ticket.clearingApproval.approved = true order by ticket] 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 
    at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) 
    at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98) 
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760) 

Любые подсказки относительно того, что случилось с моим HQL?

Спасибо,

Хосе

ответ

0

Эти ребята верны, Order зарезервирован, но не меняет имя объекта, используя обратные ссылки в определении этой таблицы.

@Entity 
@Table(name="`Order`") 
public class Order {` 

Источник: Hibernate Jira

1

order является зарезервированным JPQL и SQL ключевых слов. Измените имя своего объекта.

Ваш синтаксис также является неправильным. объединяет в HQL ассоциации между сущностями. Правильный синтаксис - это, например,

select ticket from Trade trade 
join trade.ticket ticket 
+0

Но мы используем объект заказа в других заявлениях HQL, и мы не возникнут какие-либо вопросы там. –

0

Order - зарезервированное слово; попробуйте использовать что-то еще.

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