使用Spring Data JPA排序 - 自定义存储库

时间:2012-11-21 07:03:53

标签: hibernate sorting spring-data-jpa

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

我设法通过TypedQuery通过Predicates和分页来过滤标准。

我现在面临的重大问题是排序!在自定义repo的实现中找不到这样做的方法。

有人知道怎么做吗?

TNX

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();
    }

1 个答案:

答案 0 :(得分:3)

如果AdvertiseCacheJpa模型包含“price”字段(不知道它来自这部分代码的模型),应该是这样的:

另外,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")));