@Query не работает с предикатом QueryDSL - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь использовать @ Query over QueryDSL Переопределенный метод, но когда я делаю это, он игнорирует мой предикат, который я предоставляю, например. http://localhost:8080/orders?state=Texas

Причина, по которой мне нужно @ Query , заключается в применении безопасности на основе принципала аутентификации, например,

@Query("select o from Orders o where ?#{principal.username} = o.username")

Полный код хранилища:

public interface OrderRepository extends JpaRepository<Order, Integer>, QuerydslPredicateExecutor<Order>{

    @Override
    @Query("select o from Orders o where ?#{principal.username} = o.username")
    Page<Order> findAll(Predicate predicate, Pageable pageable);
}

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

С QueryDSL предикатами вы можете создать класс для создания запроса, используя построитель запросов

Как это:

    public class OrderPredicates {

    private OrderPredicates() {

    }

     public static Predicate findByCriteria(OrderSearchCriteria orderSearchCriteria) {

            QOrder order = QOrder.order;
            BooleanBuilder builder = new BooleanBuilder();
           if(orderSearchCriteria.getUsername!=null){
            builder.or(order.username
                        .eq(orderSearchCriteria.getUsername));
           }

            //Some other predicates

            return builder;
        }
}

Но если вы хотите извлечь список Order по принципалу, вы можете создать специальный запрос

Первый: удалить переопределение

Второе: определение запроса с интуитивно понятным именем

Третье: использовать запрос параметра

@Query("from Orders o where o.username = :username")
Page<Order> findAllByUser(@Param(value="username") String username, Pageable pageable);
0 голосов
/ 29 августа 2018

Для тех, кто также хочет встроить некоторый пользовательский предикат в QueryDSL, стоит посмотреть его один раз: https://github.com/yeldarxman/QueryDslPredicateModifier

0 голосов
/ 28 августа 2018

Вы должны принять решение, если хотите, чтобы метод был реализован на основе предоставленного запроса или на основе предиката QueryDSL. Spring Data не объединяет их (как вы узнали).

В этом случае я полагаю, что у вас есть веская причина использовать QueryDSL, поэтому вам следует просто добавить основанное на принципе ограничение к этому предикату.

В этой статье показано, как получить доступ к основному , который вы можете использовать при создании предиката Querydsl.

...