我试图在 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);
}
答案 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