问题描述
@Document(collection = "messages")
public class Message {
@Id
private String id;
}
我正在使用QueryDsl生成Mongo查询。 Querydsl生成必要的QMessage类:
@Generated("com.querydsl.codegen.EntitySerializer")
public class QMessage extends EntityPathBase<Message> {
private static final PathInits INITS = PathInits.DIRECT2;
public static final QMessage message = new QMessage("message");
public final StringPath id = createString("id");
}
,其中id字段为StringPath。然后,我尝试使用带以下谓词的ID通过ID查询消息:
QMessage message = QMessage.message;
BooleanExpression predicate = message.id.goe("someId").and(message.id.loe("someId"));
并在QuerydslPredicateExecutor中使用findAll(predicate)方法。 并且确实创建了正确的查询:
find "messages",filter { $and: [ { _id: { $gte: "someId" } },{ _id: { $lte: "someId" } } ] }
但是问题是,如果按id作为字符串查询,则mongo无法找到任何内容。因为插入此文档时,mongo会在此字段上创建一个ObjectId,所以正确的查询应为:
find "messages",filter { $and: [ { _id: { $gte: ObjectId('someId') } },{ _id: { $lte: ObjectId('someId') } } ] }
所以我想出了手动创建必要路径的方法,
Path<Message> message = Expressions.path(Message.class,"message");
Path<ObjectId> idField = Expressions.path(ObjectId.class,message,"id");
Constant<ObjectId> objectIdGT = (Constant<ObjectId>) Expressions.constant(new ObjectId("someId"));
Constant<ObjectId> objectIdLT = (Constant<ObjectId>) Expressions.constant(new ObjectId("someId"));
BooleanExpression predicate = Expressions.predicate(Ops.GOE,idField,objectIdGT).and(Expressions.predicate(Ops.LOE,objectIdLT));
它可以工作,但是我想让QueryDsl和所有其他路径自动生成此路径。是否有任何注释\配置可自定义代码生成?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)