1

我有 JpaAdvertiseCacheRepositoryImpl,它是 SpringDataJpa 的自定义存储库实现。我需要这个来满足复杂的标准。

我设法通过 Predicates 过滤条件并通过 TypedQuery 进行分页。

我现在的大问题是排序!在 repo 的自定义实现中找不到执行此操作的方法。

有人知道该怎么做吗?

肿瘤坏死因子

public class JpaAdvertiseCacheRepositoryImpl implements JpaAdvertiseCacheRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<AdvertiseCacheJpa> findByFilter(FilterBuilder filter) {

        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<AdvertiseCacheJpa> query = builder.createQuery(AdvertiseCacheJpa.class);
        Root<AdvertiseCacheJpa> from = query.from(AdvertiseCacheJpa.class);

        //apply filter <- applyFilter returns array of predicates
        Predicate[] predicates = applyFilter(filter, builder, from);

        if (predicates.length > 0) {
            //query.where(builder.and(predicates));
            query.where(predicates);
        }

       //apply sorting <- THIS HAVE TO WORK SOON :)
        Sort sort = new Sort(Sort.Direction.ASC, "price");
       //query.orderBy()

       //apply pagination
       TypedQuery typedQuery = em.createQuery(query);
       typedQuery = typedQuery.setFirstResult(filter.getOffset());
       typedQuery = typedQuery.setMaxResults(filter.getMaxItemsPerPage());
       return typedQuery.getResultList();
      //return  em.createQuery(query).getResultList();
    }
4

1 回答 1

3

如果 AdvertiseCacheJpa 模型包含“价格”字段(从这部分代码中未知它来自哪个模型),应该是这样的:

另外,CriteriaBuilder 对 Spring 的 Sort 对象一无所知,所以这里不能直接使用。

代替

//apply sorting <- THIS HAVE TO WORK SOON :)
Sort sort = new Sort(Sort.Direction.ASC, "price");
//query.orderBy()

用这个

query.orderBy(builder.asc(from.get("price")));
于 2012-12-08T12:35:34.620 回答