我使用querydsl来查询mongodb。正如mongodb所允许的那样,在某些情况下,我将不同类型的对象存储在同一个集合中。
例如,在我的数据模型中,我有:
interface Notification {
NotificationType getType(); // EMAIL, SMS etc.
}
interface EmailNotification extends Notification {
Set<User> getRecipients();
}
现在我想查询任何类型的通知(不仅仅是EmailNotification),但在我有EmailNotifications的情况下,我想过滤一些收件人。
我尝试了这段代码(不起作用):
final QNotification notification = QNotification.notification;
final BooleanBuilder typesPredicate = new BooleanBuilder();
// "recipientEmails" and "recipientPhones" are provided parameters (lists of String)
typesPredicate.or(notification.type.eq(NotificationType.EMAIL)
.and(notification.as(QEmailNotification.class).recipients
.any().email.in(recipientEmails)));
typesPredicate.or(notification.type.eq(NotificationType.SMS)
.and(notification.as(QSMSNotification.class).recipients
.any().phoneNumber.in(recipientPhones)));
notificationPersister.query(Notification.class).where(typesPredicate);
它不会抛出任何错误或异常,但我没有得到预期的结果(实际上我没有得到任何结果),因为生成的mongo查询是错误的,我无法得到如何使它右。
生成的查询如下:
{
"$and":[
// ...
{
"$or":[
{
"type":"EMAIL",
"notification.recipients.email":{
"$in":[
"a@b.com"
]
}
},
// ...
]
}
]
}
关键问题在于“notification.recipients.email”:它应该只是“recipients.email”。
为什么“notification.as(QEmailNotification.class).recipients”会转换为“notification.recipients”,如何按预期进行操作?
请注意以下内容可行:
notificationPersister.query(EmailNotification.class).where(
QEmailNotification.eMailNotification.recipients.any().email.in(recipientEmails));
但是后来我被迫为每个继承的类运行1个查询,这样效率不高。
答案 0 :(得分:0)
正如蒂莫所说:通过github.com/querydsl/querydsl/pull/1428修复了querydsl