Повторно используемое логическое выражение в QueryDSL

Я только начинаю использовать QueryDSL с Spring Data JPA. У меня есть класс, в котором я храню все свои предикаты, поэтому в своих методах службы я могу просто вызвать findAll() или findOne() в своих репозиториях, передав логическое выражение. Вот пример:

Метод класса предикатов:

public static BooleanExpression byCode(String code) {

  return QHeading.heading.code.eq(code);

}

Метод класса обслуживания:

public Iterable<Heading> getByCode(final String code) {

  return headingRepository.findAll(byCode(code));

}

Это отлично работает, но в случае, когда один заголовок является дочерним элементом другого заголовка, я хотел бы повторно использовать тот же метод из моего класса предикатов, просто обернув его в другой метод, который возвращает родительский заголовок, а не дочерний элемент, который соответствует логическое выражение. Тем не менее, у меня возникли проблемы с выяснением правильного способа сделать это.

Итак, это будет что-то вроде этого:

Предикативные методы:

public static BooleanExpression byCode(String code) {

  return QHeading.heading.code.eq(code);

}

public static BooleanExpression byChildCode(String code) {

  QHeading.heading.childHeadings.eq(byCode(code));

}

Метод обслуживания:

public Iterable<Heading> getByChildCode(final String code) {

  return headingRepository.findAll(byChildCode(code));

}

Очевидно, что метод eq() не работает, но есть ли способ сделать это, или я должен действовать по-другому?


person Luke    schedule 20.05.2013    source источник


Ответы (1)


Вы можете сделать это так

public static BooleanExpression byCode(String code) {
    return QHeading.heading.code.eq(code);
}

public static BooleanExpression byChildCode(String code) {
    return QHeading.heading.childHeadings.any().code.eq(code);
}

или если вы хотите больше повторного использования кода:

private static BooleanExpression byCode(QHeading heading, String code) {
    return heading.code.eq(code);
}

public static BooleanExpression byCode(String code) {
    return byCode(QHeading.heading, code);
}

public static BooleanExpression byChildCode(String code) {
    return byCode(QHeading.heading.childHeadings.any(), code);
}
person Timo Westkämper    schedule 20.05.2013
comment
Очень хорошо. Спасибо за ответ. Кажется, пока работает отлично. - person Luke; 20.05.2013