Spring中使用Criteria遇到的问题
Spring中使用Criteria遇到的问题
Neon_Wang 发表于6个月前
Spring中使用Criteria遇到的问题
  • 发表于 6个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

很久之前也遇到过一样的问题,发现自己没📈什么记性,果然是好记性不如烂笔头,在此记录下,以免下次再次踩坑。 →。→

创建如下对象:

@Document(collection="Work")
@Data
class Work{
    @Id
    @JsonView(InspectionView.class)
    private String id;
    
    @JsonView(WorkTypeView.class)
    private WorkType workType;

    @JsonView(InspectionView.class)
    private PersonSnapshot personSnapshot;

    @Data
    class PersonSnapshot{

        @JsonView(InspectionView.class)
        private String id;
        
        @JsonView(InspectionView.class)
        private String name;
    }
}

在使用Criteria拼接查询语句中,criteria.and("personSnapshot.id").in(Person.getId());

执行后发现没有查到任何数据,一开始还以为是没有对应的数据,手动去Mongo确认了一下发现并不是这样。

想了很久没什么思路,通过Debug信息输出发现每次执行,personSnapshot.id -> personSnapshot._id

Spring提供的MongoTemplate中,对于属性的处理:

try {

    Field field = createPropertyField(entity, key, mappingContext);
    Entry<String, Object> entry = getMappedObjectForField(field, query.get(key));
    result.put(entry.getKey(), entry.getValue());
} catch (InvalidPersistentPropertyPath invalidPathException) {
    // in case the object has not already been mapped
    if (!(query.get(key) instanceof DBObject)) {
	throw invalidPathException;
    }
    result.put(key, query.get(key));
}

由于急于处理问题,所以没有跟踪的很仔细,但QueryMapper以及其内部类Field中发现存在

private static final List<String> DEFAULT_ID_NAMES = Arrays.asList("id", "_id");
private static final String ID_KEY = "_id";

由此猜测Spring会根据传入的对象映射其属性,对id属性进行默认加“_”操作。

所以尝试着在对象属性中加入@Field("id")注解:

    @Data
    class PersonSnapshot{

        @Field("id")
        @JsonView(InspectionView.class)
        private String id;
        
        @JsonView(InspectionView.class)
        private String name;
    }

结果是令人满意的, 终于找出了问题所在。

共有 人打赏支持
粉丝 2
博文 5
码字总数 3810
×
Neon_Wang
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: