微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将QueryDsl与Spring结合使用时更改生成的QEntity类字段类型

如何解决将QueryDsl与Spring结合使用时更改生成的QEntity类字段类型

我有一个实体类

@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和所有其他路径自动生成此路径。是否有任何注释\配置可自定义代码生成

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。