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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...