我在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这样的标准。
我想知道是否还有其他方法可以做,因为表中的列数可能很高。
答案 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()]));
因此,您可以根据需要扩展参数列表,而无需使用字符串。