手动OQL查询中的Spring Data GemFire和“Unexpected Token”

问题描述 投票:0回答:1

我正在使用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-boot gemfire spring-data-gemfire
1个回答
1
投票

问题不在于Spring Data GemFire。

如果你包括你正在使用的Spring Data GemFire和Pivotal GemFire的版本也会有所帮助(例如Spring Data GemFire 1.9.10.RELEASEpulls in Pivotal GemFire 8.2.8,或者你使用的是Spring Data GemFire 2.0.4.RELEASEpulls in Pivotal GemFire 9.1.1 ;有关详细信息,请参阅version compatibility page)。

虽然这个问题非常明显,但您可能还想注意下次包含任何堆栈跟踪或日志输出。

所以,你遇到的问题与此直接相关......

1)关于timestamp ....

timestampreserved 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

© www.soinside.com 2019 - 2024. All rights reserved.