#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.