@Query无法与QueryDSL谓词一起使用

时间:2018-08-28 08:11:44

标签: spring-boot spring-security spring-data-jpa querydsl

我试图在 QueryDSL 的Overrided方法上使用 @Query ,但是当我这样做时,它忽略了我提供的谓词例如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 :(得分:1)

如果要基于提供的查询或QueryDSL谓词实现方法,则必须下定决心。 Spring Data不会将它们合并(如您所知)。

在这种情况下,我假设您有充分的理由使用QueryDSL,因此您应该将基于主体的约束添加到该谓词中。

This article shows how to access the principal,可在构造Querydsl谓词的任何地方使用。

答案 1 :(得分:1)

使用 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;
        }
}

但是,如果您想按主体提取订单列表,则可以创建一个临时查询

首先:删除替代

第二:使用直观名称定义查询

第三:使用参数查询

@Query("from Orders o where o.username = :username")
Page<Order> findAllByUser(@Param(value="username") String username, Pageable pageable);

答案 2 :(得分:0)

对于任何想在QueryDSL中嵌入一些自定义谓词的人,都应该查看一下它:https://github.com/yeldarxman/QueryDslPredicateModifier