2016-04-13 4 views
1

Я использую пейджинг и сортировку репозитория для jquery datatable в моем проекте весны. Я попытался найти с тремя параметрами, как сейчас любятКак выполнить поиск по нескольким параметрам с помощью подкачки и сортировки репозитория?

@Query(value = "Select p from ProfileBaseInfo p where p.fullName = :fullName or p.firstName = :firstName or p.lastName = :lastName") 
Page<ProfileBaseInfo> search(@Param("fullName") String fullName,@Param("firstName") String firstName,@Param("lastName") String lastName,Pageable pageable); 

Теперь мне нужно искать более 5 параметров дополнительно с различными комбинациями (т.е.. И/или). Я создал dynamic query на основе найденных параметров. (i.e) Если присутствует параметр, я присоединяюсь к таблице и вставляю условие where. Как принести динамически сгенерированный запрос внутри @Query или я должен обрабатывать это по-другому? Теперь я хочу, я должен построить такой критерий, как "SELECT * FROM profile where name=? and fullName=? and title=? and city=? and state=? and country=?" in ***@Query*** Аннотация.

Я хотел бы знать, есть ли другой способ, потому что количество столбцов в таблице может быть высоким.

ответ

0

Я думаю, вам следует создать весенний боб с реализацией вашего метода поиска (Spring Data). @Autowire некоторый bean для того чтобы поговорить с DB (EntityManager или подобным) и записать любой запрос вам.

Я бы порекомендовал вам использовать какой-то объект оболочки для всех параметров, как

class Parameters { 
    String firstName, 
    String fullName; 
    ... 
    Object paramN; 

    <<getters-setters ?>> 
} 

и использовать CriteriaQuery для построения запроса в соответствии с параметрами, как

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<ProfileBaseInfo> cq = cb.createQuery(ProfileBaseInfo.class); 
Root<ProfileBaseInfo> from = cq.from(ProfileBaseInfo.class); 
... 
List<Predicate> predicates = Lists.newArrayList(); 
... 
if (param.getFullName() != null) { 
    predicates.add(cb.like(cb.lower(ProfileBaseInfo_.fullName)), param.getFullName().toLowerCase() + "%")) 
} 
... 
cb.and(predicates.toArray(new Predicate[predicates.size()])); 

Так вы может расширять список параметров, приближающихся к потребностям, и нет необходимости работать со строками.