如何使用 querydsl 查询继承 类
How to query on inherited classes with querydsl
我使用 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));
但后来我被迫 运行 每个继承 class 1 次查询,效率不高。
正如 Timo 所说:通过 github.com/querydsl/querydsl/pull/1428
在 querydsl 中修复
我使用 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));
但后来我被迫 运行 每个继承 class 1 次查询,效率不高。
正如 Timo 所说:通过 github.com/querydsl/querydsl/pull/1428
在 querydsl 中修复