Spring 手动 OQL 查询中的数据 GemFire 和 'Unexpected Token'

Spring Data GemFire and 'Unexpected Token' in manual OQL query

我正在使用 Spring Data GemFire 触发查询并在查询中收到“语法错误:意外标记:时间戳”。

我无法弄清楚这个问题。

@Query("SELECT * FROM /Trade T WHERE T.stock.symbol = ORDER BY T.timestamp desc LIMIT 15")
  public List<Trade> findAllTradeForStock(String stock);

贸易 Class:

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 GemFirePivotal GemFire 的版本,这也会有所帮助使用(例如 Spring Data GemFire 1.9.10.RELEASEpulls in Pivotal GemFire 8.2.8, or maybe you are using Spring Data GemFire 2.0.4.RELEASE, which pulls in Pivotal GemFire 9.1.1; see the version compatibility page 了解更多详情)。

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

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

1) 关于timestamp...

timestamp 是一个 reserved word and OQL query 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

最后一个提示,您的查询并不那么复杂,可以使用存储库查询方法抽象轻松地正确表达,而不是求助于使用 @Query,这在这种情况下不是必需的...

interface TradeRepository extends CrudRepository<Trade, Long> {

  @Limit(15)
  List<Trade> findDistinctTradeByStockSymbolOrderByTradeTimestampDesc(String stockSymbol);

}

这是一个类似的复杂存储库实现(例如 ContactRepository),它还包括使用 "convention" 生成正确 GemFire OQL 的查询方法,例如 for nested types.

查看此 Repository 接口定义(对于 Contact)上的其他一些 "query methods",了解其他可能的示例。

可以找到 ContactRepository 的相应集成测试 here

-j