我有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();
}
答案 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")));