【问题标题】:@Query not working with QueryDSL predicate@Query 不适用于 QueryDSL 谓词
【发布时间】:2019-02-02 19:18:05
【问题描述】:

我正在尝试通过 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);
}

【问题讨论】:

  • 你只有一个谓词值?我发现您的代码中有一些错误!
  • 你好朋友,像这样的错误?不,我有多个谓词,实际上我必须向 ui 设计团队提供该微服务,他们将根据他们的需要使用它,并且不希望我为他们的需要编写任何固定方法,他们需要对 API 开放手,所以他们可以根据自己的要求进行查询。

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


【解决方案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;
        }
}

但是如果你想提取 Order by principal 的列表,你可以创建一个 ad-hoc 查询

首先:删除覆盖

第二:用直观的名字定义查询

第三:使用参数查询

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

【讨论】:

  • 你说得对,我的朋友,但我有限制不要使用任何自定义名称方法或固定编号。的参数。 @Jens Schauder 了解我的情况。
  • @PaolaG 这是什么 QOrder 以及如何从 QueryDSL 创建一个??
  • @KNDheeraj QOrder 是在存储库接口中使用 QueryDSL 自动创建的,如果我没记错的话。
【解决方案2】:

如果您想要基于提供的查询或基于 QueryDSL 谓词实现的方法,您必须下定决心。 Spring Data 没有将它们结合起来(如您所见)。

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

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

【讨论】:

  • 嗨,朋友,我如何在用户(UI 团队)提供的谓词中附加/合并我的委托人的任何示例代码或详细信息?
  • 其实是关于访问主体,我想合并我的两个作品 1. @Query("select o from Orders o where ?#{principal.username} = o.username") 2. Page findAll(Predicate predicate, Pageable pageable);意味着我想在存储库上应用用户提供的谓词,但同时应用/附加我的自定义过滤器。例如他们只能将过滤器(谓词)应用于与他们相关的订单(其中用户名 = principal.username),明白我的意思吗?
【解决方案3】:

对于还想在 QueryDSL 中嵌入一些自定义谓词的人来说,应该看一次:https://github.com/yeldarxman/QueryDslPredicateModifier

【讨论】:

  • 无法访问链接。
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 2021-04-13
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
相关资源
最近更新 更多