Spring Data JPA原生查询中的order by无效。

11
Spring Data JPA(Java Persistence API)提供了以下方法:
@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);

然后按“max_borrow_amt desc”排序,但这是无效的。列表是无序的。

4
预处理语句中不能将“order by”作为参数设置排序顺序。 - Jens
2个回答

16

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 不能使用 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"));

P.S. 使用projections比返回Object数组作为参数更好,例如:

public interface ModelProjection {
    String getName();
}

注意,在这种情况下,最好在查询中使用别名(即m.name as name)。它们必须与投影中相应的getter匹配。
正在工作的演示测试

0
感谢大家!我的问题已经解决。
如果你想使用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和本地查询与分页

请看:Spring Data和本地查询分页 - 桃桃桃子
1
在最新版本的Spring Boot中,不必使用那些带有?#{#pageable}的技巧。请查看我的demo和其test - Cepr0
@Cepr0,你能回答这个问题吗?https://stackoverflow.com/questions/77465994/unable-to-sort-using-org-springframewrk-data-domain-sort-for-2-date-fields - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接