【问题标题】:Spring data JPA nativeQuery order by is invalidSpring data JPA nativeQuery order by 无效
【发布时间】:2019-01-27 11:19:02
【问题描述】:

Spring Data Jpa 方法如下:

@Query("select pb.id,pp.max_borrow_amt,pp.min_borrow_amt
from product_loan_basic pb left join product_loan_price pp on pb.code=pp.product_code 
 where pb.code IN(?1) and pb.status='publish' order by  ?2 ",
nativeQuery = true)  
List<Object[]> findByCodesIn(List<String> codes,String orderby);

那么 order by 是“max_borrow_amt desc”,但这是无效的。
列表是无序的。

【问题讨论】:

  • 您不能在准备好的语句中将顺序设置为参数

标签: java sql postgresql spring-boot spring-data-jpa


【解决方案1】:

Spring Data JPA 中的动态排序

如果您使用 JPA 查询,您可以使用 Sort 作为查询方法的参数来定义排序顺序:

@Query("select m from Model m")
List<Model> getSortedList(Sort sort);

然后,例如:

List<Model> models = getSortedList(Sort.by(Sort.Direction.DESC, "name"));

但是带有原生查询的 Spring Data JPA can't use Sort

Spring Data JPA 目前不支持本地查询的动态排序,因为它必须操作声明的实际查询,而对于本地 SQL,它不能可靠地做到这一点。

但是,您可以改用Pageable 及其实现PageRequest

@Query(value = "select m.name as name from models m", nativeQuery = true)
List<ModelProjection> getSortedList(Pageable p);

然后:

List<ModelProjection> modelNames = getSortedList(PageRequest.of(0, 1000, Sort.Direction.DESC, "name"));

附:而不是Objects的数组作为返回参数,最好使用projections,例如:

public interface ModelProjection {
    String getName();
}

请注意,在这种情况下,好的做法是在查询中使用别名(即m.name as name)。它们必须与投影中对应的 getter 匹配。

工作demotest

【讨论】:

    【解决方案2】:

    谢谢大家! 我的问题已经解决了。

    如果你想使用 Spring data jpa nativeQuery & Sort,你应该这样做:

     @Query(
              value ="select pb.id,pp.max_borrow_amt from product_loan_basic pb left join product_loan_price pp on pb.code=pp.product_code ORDER BY ?#{#pageable}  ",
              countQuery = "select count(*) from product_loan_basic",
              nativeQuery = true
      )
      Page<Object[]> findAllProductsAndOrderByAndSort(Pageable pageable);
    

    ?#{#pageable} 是必需的,countQuery 是必需的。

    Pageable pageable = new PageRequest(0,1000,Sort.Direction.DESC,"id");
    

    然后对结果进行排序。

    Spring Data and Native Query with pagination

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2017-01-16
    • 2017-09-25
    • 2022-01-21
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    相关资源
    最近更新 更多