我使用 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;
}
答案 0 :(得分:1)
问题不在于 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。
查看此存储库接口定义(对于Contact
)的其他一些“查询方法”,了解可能的其他示例。
可以找到ContactRepository
的相应整合测试here。
-j