我指的是关于创建自定义存储库的this link。我正在创建一个Spring Boot应用程序,该应用程序当前具有自定义存储库接口,如下所示。
public interface CustomMyDomainRepository {
Page<MyDomain> findBySearchCriteria(SearchFields searchFields, Pageable pageable);
}
目前,其实施如下。
@Repository
public class CustomMyDomainRepositoryImpl implements CustomMyDomainRepository {
@PersistenceContext
EntityManager entityManager;
public Page<MyDomain> findBySearchCriteria(SearchFields searchFields, Pageable pageable) {
Query query = getQuery(searchFields, pageable);
List<MyDomain> myDomains = query.getResultList();
return new PageImpl<>(myDomains, pageable, myDomains.size());
}
private Query getQuery(SearchFields searchFields, Pageable pageable) {
StringBuilder stringBuilder = new StringBuilder();
Map<String, Object> map = new HashMap<>();
stringBuilder.append("SELECT md.* FROM my_domain as md WHERE ");
if (Objects.nonNull(searchFields.getStatus()) && !searchFields.getStatus().isEmpty()) {
stringBuilder.append("md.status = :status AND ");
map.put("status", searchFields.getStatus());
} //... And many more search fields
// Confused how to use Pageable for sorting
// stringBuilder.append("ORDER BY :sortColumn :sortType");
Query query = entityManager.createQuery(stringBuilder.toString());
for (String param : map.keySet()) {
query.setParameter(param, map.get(param));
}
return query;
}
}
我在这段代码中遇到了不止一个问题。
第一个也是最重要的问题是,我很困惑如何使用Pageable为此搜索查询设置分页。
第二个问题是目前SearchFields只有2个属性。但它可以达到20个搜索字段。有没有更好的方法来查询所有这些字段,而不是像我上面那样有条件地更新查询字符串?
从长远来看,将查询构建为String将非常麻烦。看看可以使用流畅的API构建自定义查询的替代方法,例如:
最后,您仍然需要有条件地构建查询或示例,但它会比连接字符串更简单,更不容易出错且更安全。