Запрос DSL — сгенерировать правильный запрос

#spring-data-mongodb #querydsl #spring-mongodb

#spring-data-mongodb #querydsl #spring-mongodb

Вопрос:

Я хочу создать этот запрос:

 {"userType":"USER","$and":[{"$or":[{"firstName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}},{"lastName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}},{"middleName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}}]},{"$or":[{"firstName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}},{"lastName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}},{"middleName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}}]}]}
 

Но я получаю этот запрос:

 {"$and":[{"userType":"USER","$or":[{"firstName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}},{"lastName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}},{"middleName":{"$regularExpression":{"pattern":".*\QJohn\E.*","options":""}}}]},{"$or":[{"firstName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}},{"lastName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}},{"middleName":{"$regularExpression":{"pattern":".*\QDoe\E.*","options":""}}}]}]}
 

Что я делаю не так? Это мой конструктор QueryDSL:

     QUser user = QUser.user;
    BooleanBuilder builder = new BooleanBuilder(user.userType.eq(UserType.USER));

    BooleanExpression e1 = Expressions.anyOf(
            user.firstName.contains("John"),
            user.lastName.contains("John"),
            user.middleName.contains("John"));

    BooleanExpression e2 = Expressions.anyOf(
            user.firstName.contains("Doe"),
            user.lastName.contains("Doe"),
            user.middleName.contains("Doe"));

    BooleanExpression e3 = Expressions.allOf(e1, e2);

    builder.and(e3);
 

Этот конструктор генерирует этот псевдокод (я видел в debbuger):

 user.userType = USER 
amp;amp; (contains(user.firstName,John) || contains(user.lastName,John) || contains(user.middleName,John)) 
amp;amp; (contains(user.firstName,Doe) || contains(user.lastName,Doe) || contains(user.middleName,Doe))
 

Мне нужно получить запрос, подобный запросу в моем первом примере.

ОТРЕДАКТИРОВАНО:

Я создал правильный запрос с критериями. Может ли кто-нибудь создать то же самое с помощью QueryDSL?

     Query query = new Query();

    Criteria criteria = Criteria.where("userType").is(UserType.USER);

    Criteria criteria1 = new Criteria();
    criteria1.orOperator(
            Criteria.where("firstName").is("John"),
            Criteria.where("lastName").is("John"),
            Criteria.where("middleName").is("John"));

    Criteria criteria2 = new Criteria();

    criteria2.orOperator(
            Criteria.where("firstName").is("Doe"),
            Criteria.where("lastName").is("Doe"),
            Criteria.where("middleName").is("Doe"));

    criteria.andOperator(criteria1, criteria2);

    query.addCriteria(criteria);
 

Комментарии:

1. На вас повлияла ошибка в сериализаторе MongoDB. Надеюсь, это будет исправлено в следующей версии QueryDSL.

2. @Ян-Виллем Гмелиг Мейлинг Вы уверены? Я потратил на это много времени. Если вы уверены, я буду использовать критерии в этом случае. Можете ли вы поделиться ссылкой на эту ошибку?

3. Видишь github.com/querydsl/querydsl/issues/2638 и github.com/querydsl/querydsl/pull/2689#discussion_r516029138

4. Последний комментарий содержит исправление, но в другом модуле. Исправление все еще необходимо применить к MongodbSerialzer в модуле querydsl-mongodb.