Sorting by case using Hibernate

时间:2018-01-23 19:27:24

标签: spring hibernate jpa jpql

We have a typeahead that allows our customers to do a global search of their clients. Based on a 'filterText', we want to retrieve all the clients where any of the following fields contain the filterText: clientName, clientStreet, clientCity... but now there's a requirement and we want to prioritize the results where the clientName contains the filterText. (They should be shown first)

We currently create a customerSpecification, and the Predicate that it's being used is the following one:

return criteriaBuilder.or(
            criteriaBuilder.like(customerName, likeFilter),
            criteriaBuilder.like(customerStreet, likeFilter),
            criteriaBuilder.like(customerCity, likeFilter),
            criteriaBuilder.like(customerState, likeFilter),
            criteriaBuilder.like(customerZip, likeFilter),
            criteriaBuilder.like(customerCountry, likeFilter),
            tempPred
);

and then we use it to get the Page with all the results

customerRepository.findAll(customerSpecification, pageable);

How can we introduce this new requirement? Any approaches?

Some pages suggest to use selectCase, doing something like this:

Expression<Object> caseExpression = criteriaBuilder.selectCase()
                .when(criteriaBuilder.like(root.get(CustomerEntity_.name), likeFilter), 1)
                .otherwise(2);
Order order = criteriaBuilder.desc(caseExpression);
criteriaQuery.orderBy(order);

But I can't find the way to make it works. I also found some talks about PageRequest, which receives a Sort parameter, but I didn't find how it would help, as this object is too simple for what we're looking for.

Thanks

0 个答案:

没有答案