Spring Data GemFire和' Unexpected Token'在手动OQL查询中

时间:2018-02-27 20:39:28

标签: spring-boot gemfire spring-data-gemfire

我使用 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;

}

1 个答案:

答案 0 :(得分: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

查看此存储库接口定义(对于Contact)的其他一些“查询方法”,了解可能的其他示例。

可以找到ContactRepository的相应整合测试here

-j