我正在使用Spring Data GemFire触发查询并在查询中获得“`语法错误:意外令牌:时间戳。
我无法弄清楚这个问题。
@Query("SELECT * FROM /Trade T WHERE T.stock.symbol =$1 ORDER BY T.timestamp desc LIMIT 15")
public List<Trade> findAllTradeForStock(String stock);
交易类别:
public class Trade implements Serializable {
private static final long serialVersionUID = 3209342518270638001L;
@Id private int tradeIdentifier;
private Stock stock;
private LocalDateTime timestamp;
}
问题不在于Spring Data GemFire。
如果你包括你正在使用的Spring Data GemFire和Pivotal GemFire的版本也会有所帮助(例如Spring Data GemFire 1.9.10.RELEASE
,pulls in Pivotal GemFire 8.2.8
,或者你使用的是Spring Data GemFire 2.0.4.RELEASE
,pulls in Pivotal GemFire 9.1.1
;有关详细信息,请参阅version compatibility page)。
虽然这个问题非常明显,但您可能还想注意下次包含任何堆栈跟踪或日志输出。
所以,你遇到的问题与此直接相关......
1)关于timestamp
....
timestamp
是reserved word和OQL查询supported literal。您不能在域对象(例如timestamp
)上使用“Trade
”作为字段或属性。
2)关于ORDER BY
......
Pivotal GemFire does not support non-DISTINCT, ORDER BY queries(第4章)。
Spring Data GemFire都没有出现这些问题。这些是Pivotal GemFire的限制和限制。
如果您想了解如何构造正确和正确的OQL(查询)语句,请参阅Pivotal GemFire's documentation。
最后一个提示,您的查询并不复杂,可以使用Repository查询方法抽象轻松表达,而不是诉诸使用@Query
,在这种情况下不需要...
interface TradeRepository extends CrudRepository<Trade, Long> {
@Limit(15)
List<Trade> findDistinctTradeByStockSymbolOrderByTradeTimestampDesc(String stockSymbol);
}
这是一个类似的复杂的Repository实现(例如ContactRepository
),它还包括使用“约定”生成适当的GemFire OQL的查询方法,例如for nested types。
查看此Repository接口定义(对于Contact
)的其他一些“查询方法”,以获取可能的其他示例。
ContactRepository
的相应集成测试可以找到here。
-j