【问题标题】:I am trying to use dynamic order by but the list retrieved is not ordered我正在尝试使用动态排序,但检索到的列表未排序
【发布时间】:2015-01-19 16:56:55
【问题描述】:
public List<Series> findSeries(int period, String fieldname, int num) {
    TypedQuery<Series> query = em.createQuery(
            "select s from Series s where  s.period = ?1 order by ?2",
            Series.class);
    query.setParameter(1, period);
    query.setParameter(2, fieldname);
    query.setMaxResults(num);
    return query.getResultList();
}

这是我正在使用的方法。我认为 order by 甚至没有被执行,即使我传递了不正确的字段名,它也不会给出任何错误。

【问题讨论】:

  • 您是否尝试过直接在order by 中输入列名,而不是将其作为参数传递?我认为问题是,您的变量fieldName 是字符串类型。类型化查询将其作为字符串文字而不是列名。 select s from series where s.period = ?1 order by "filedName"。这就是为什么我认为它不起作用。

标签: spring-data


【解决方案1】:

当涉及到动态限制和排序时,最好使用 PagingAndSortingRepository,所以现在我的存储库扩展了这个存储库。我可以简单地使用 JPA 条件查询,如下所示。

如果您想了解更多关于 JPA 标准查询的信息,我发现这非常有帮助 http://docs.spring.io/spring-data/data-jpa/docs/1.0.x/reference/html/#jpa.query-methods.query-creation

 @Repository
public interface SeriesRepository extends PagingAndSortingRepository<Series,Long>{
List<Series> findByPeriod(int period, Pageable pageable);
}

然后当我从我的 dao 调用此方法时,我可以实例化 PageRequest,它是 Pageable 的实现之一。我可以为这个实例添加限制和排序顺序。

public List<Series> getSeriesByFilter(int period, String fieldname, int num) {
    Sort sort = new Sort(Sort.Direction.ASC, fieldname);
    Pageable pageable = new PageRequest(0, num, sort);
    return seriesRepo.findByPeriod(period, pageable);
}

【讨论】:

    【解决方案2】:

    您不能按顺序将变量作为列名传递。

    有一种变通方法可以帮助您实现您正在尝试的目标。

    public List<Series> findSeries(int period, String fieldname, int num) {
        String query = "select s from Series s where s.period = "+period+" order by "+fieldname;
    
         return entityManager.createQuery(query).getResultList();
    }
    

    检查这个问题Hibernate Named Query Order By parameter

    有一些方法可以在 ASP 中传递 order by 中的列名,但是我在 Spring 或 JPA 中找不到任何东西。

    "Order By" using a parameter for the column name

    http://databases.aspfaq.com/database/how-do-i-use-a-variable-in-an-order-by-clause.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2016-10-20
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    相关资源
    最近更新 更多