2015-10-20 107 views
0

我是新来的JPQL和挣扎了一下翻译我的SQL来JPQL。我有一个简单的查询,这在MySQL的工作原理:MySQL来JPQL内加入

SELECT askorder.price, bidorder.price from OrderBook JOIN askorder 
ON OrderBook.ASKORDERID_ORDERID = askorder.ORDERID 
JOIN bidorder ON OrderBook.BIDORDERID_ORDERID = bidorder.ORDERID 
WHERE askorder.ORDERID = 2; 

我已经尝试此转化为JPQL但我敢肯定这是错的。具体来说,我认为这可能是ON关键字,我不知道如何翻译,为JPQL:

@NamedQuery(
    name="findOrderBooksPrices", 
    query="SELECT ao.price, bo.price from OrderBook bo, OrderBook ao" + 
    "INNER JOIN ao ON bo.ASKORDERID_ORDERID = ao.ORDERID " + 
    "INNER JOIN bo ON OrderBook.BIDORDERID_ORDERID = bo.ORDERID " + 
    "WHERE ao.ORDERID = :askOrderId" 
) 

我得到的错误是:

Internal Exception: Exception [EclipseLink-7158] (Eclipse Persistence 
Services - 2.5.0.v20130507-3faac2b): 
org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Error encountered when building the @NamedQuery 
[findOrderBooksPrices] from entity class [class 
org.eclipse.persistence.internal.jpa.metadata.queries. 
NamedQueryMetadata].Internal Exception: java.lang.ClassCastException: 
org.eclipse.persistence.jpa.jpql.parser.NullExpression cannot be cast to 
org.eclipse.persistence.jpa.jpql.parser.IdentificationVariable. Please 
see server.log for more details. 

我想它返回提交订单ID后,每个订单表的价格。

感谢您寻找。 干杯, Zerb

+0

为什么宥调用表'ao'这里'INNER JOIN AO ON'但在核心的MySQL调用表'JOIN askorder ON'等什么是真实的表名? – Alex

+0

真正的表名是askorder。我刚刚听到我的语法困惑。 – zobbo

回答

0

只是一个猜测:

query="SELECT ao.price, bo.price FROM OrderBook " + 
    "INNER JOIN askorder ao " + 
    "INNER JOIN bidorder bo " + 
    "WHERE ao.ORDERID = :askOrderId" 
+0

感谢亚历克斯,但我仍然得到与该查询相同的例外,但我认为它比我有更正确的。 – zobbo

+0

@zobbo所以尝试注释除第一个'query =“SELECT ao.price,bo.price FROM OrderBook”'之外的所有行。如果它的工作取消注释下一行。依此类推。 – Alex

+0

'SELECT bo.price FROM手持订单bo'工作时,下一行'INNER JOIN AskOrder AO ON OrderBook.ASKORDERID_ORDERID = ao.ORDERID'失败。自从原创失败后,我编辑了第一行。试图现在解决第二条线。 – zobbo