【发布时间】:2018-02-26 18:04:35
【问题描述】:
我目前已经实现了一个动态查询构建器,如果我的查询条件拼写正确,它可以完美运行。由于情况可能并非总是如此,因此我需要一个足够灵活的解决方案来应对条件的任何变化,主要是支持不区分大小写。
当前规范的 toPredicate 方法覆盖代码如下所示:
final List<Predicate> predicates = new ArrayList<Predicate>();
Path<String> username = root.get("username");
Path<String> agentCode = root.get("agentCode");
Path<EntityStatus> status = root.get("status");
Path<String> firstname = root.get("firstName");
Path<String> lastname = root.get("lastName");
Path<String> email = root.get("eMail");
if(criteria.getUsername()!=null && !criteria.getUsername().isEmpty()) {
predicates.add(cb.equal(username, criteria.getUsername()));
}
if(criteria.getAgentCode()!=null && !criteria.getAgentCode().isEmpty()) {
predicates.add(cb.equal(agentCode, criteria.getAgentCode()));
}
if(criteria.getFirstName()!=null && !criteria.getFirstName().isEmpty()) {
predicates.add(cb.like(firstname, "%"+criteria.getFirstName()+"%"));
}
if(criteria.getLastName()!=null && !criteria.getLastName().isEmpty()) {
predicates.add(cb.equal(lastname, criteria.getLastName()));
}
if(criteria.getEMail()!=null && !criteria.getEMail().isEmpty()) {
predicates.add(cb.equal(email, criteria.getEMail()));
}
if(criteria.getStatus()!=null) {
predicates.add(cb.equal(status, criteria.getStatus()));
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
从服务层调用的我的存储库接口看起来像这样。
public interface UserRepo extends PagingAndSortingRepository<User, Long> {
List<User> findAll(Specification spec);
}
【问题讨论】:
-
“采取任何条件变化。”你能更具体地说明允许的变化吗?只是区分大小写吗?顺便说一句,您应该做一个方法来检查并添加是否有效,这确实是重复代码)
-
@AxelH 是的,很抱歉没有指定。它主要必须支持不区分大小写。
-
@JEY 它不是重复的,我已经查看了该帖子,其中解决方案是使用 CriteriaQuery 构建自定义查询。我没有使用我只使用 CriteriaBuilder 并通过接口让 spring JPA 创建和执行查询。我的代码更像是简单地设置条件
-
完全一样。
标签: java sql spring string jpa