如何使用分页和排序存储库搜索多个参数?

时间:2016-04-13 12:18:30

标签: java jquery spring-data-jpa

我在spring项目中使用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。 (即)如果存在参数,我将加入表并插入where条件。如何在@Query内部引入动态生成的查询,还是应该以不同的方式处理此问题?现在我想要的是我必须建立像"SELECT * FROM profile where name=? and fullName=? and title=? and city=? and state=? and country=?" in ***@Query*** Annotation这样的标准。

我想知道是否还有其他方法可以做,因为表中的列数可能很高。

1 个答案:

答案 0 :(得分:0)

我认为你应该创建一个Spring bean来实现你的搜索方法(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()]));

因此,您可以根据需要扩展参数列表,而无需使用字符串。