Spring Boot 数据如何正确管理 NumberLong 的查询?

Posted

技术标签:

【中文标题】Spring Boot 数据如何正确管理 NumberLong 的查询?【英文标题】:Springboot data how to make a Query correctly managing NumberLong? 【发布时间】:2018-08-12 11:18:19 【问题描述】:

我在 MongoDb 中存储带有 Int64 字段的元素。我正在使用所有 bigfield 和真正的 64 位值生成一个值。

文档看起来像 归档... messageUid:-3130564683773456202

用springboot-data写这个long值没问题。

现在我想对这个值进行搜索,而 SpringBoot-data 什么也不返回...

findMessagesByMessageUid(long _messageUid) returns nothing.
findMessagesByMessageUid(Long _messageUid) returns nothing.

我直接在 mongoShell 中尝试过 1 - 查找(messageUid:-3130564683773456202) 这是行不通的,因为 shell 将数字转换为双精度值,最后值不完全匹配

2 - 查找(messageUid: NumberLong(-3130564683773456202)) 这不起作用,因为值太大(有限制,我在某处读过)

3 - find(messageUid: NumberLong("-3130564683773456202")) 这工作正常

所以我想知道如何用 SpringBoot-data 编写第三版查询

我尝试了不同的东西

@Query("messageUid:NumberLong(?0)")
public Message findMessageByMessageUid( long messageUid  );

=> 启动时 JSON 解析异常

@Query("messageUid:NumberLong(?0)")
public Message findMessageByMessageUid( String messageUid  );

=> 启动时 JSON 解析异常

基本上我们不能在@Query 字符串中使用 NumberLong。

我也试过

public Message findMessageByMessageUid( String messageUid  );

=> 不返回匹配的文档

有人能告诉我如何使用 Spring-data 对 NumberLong 进行有效搜索吗?

【问题讨论】:

【参考方案1】:

试试这个

@Query(" 'messageUid' : NumberLong(?0) ")
public Message findMessageByMessageUid( Long messageUid  );

【讨论】:

不工作:同样的解析问题:引起:com.mongodb.util.JSONParseException: 'messageUid' : NumberLong("_param_0") ^ at com.mongodb.util.JSONParser.read( JSON.java:301) ~[mongodb-driver-3.4.3.jar:na] messageUid 数据类型是什么? Int64数据类型 您应该在您的存储库方法中使用Long,像这样public Message findMessageByMessageUid( Long messageUid ); 从您的评论错误来看,我相信您正在使用String。请确认 长我没有任何价值,就像长一样。

以上是关于Spring Boot 数据如何正确管理 NumberLong 的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Thymeleaf 在 Spring Boot 应用程序中正确缓存数据

Spring Boot 2.x基础教程:事务管理入门

Spring Boot事务配置管理

和spring cloud/boot 学习如何管理自己的组件

如何正确实现使用 Spring MVC\Boot 返回图像列表的 REST 服务?

管理员如何使用 Spring Boot 锁定/解锁在 mysql 数据库中注册的用户?