如何使用querydsl

时间:2015-07-02 08:56:39

标签: java mongodb 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));

但是后来我被迫为每个继承的类运行1个查询,这样效率不高。

1 个答案:

答案 0 :(得分:0)

正如蒂莫所说:通过github.com/querydsl/querydsl/pull/1428修复了querydsl