我有一个spring引导应用程序,我希望有一个动态查询条件,也就是说,我想要创建一个可以接收以下可选参数的方法:年龄和名称。我的问题是,这些参数是可选的,这意味着它们有时可以是空的,我想动态地构建我的查询,例如,如果参数不是空或空,我就把它们作为标准放在我的查询中,否则我就不会。
我为这个问题找到的解决方案基本上是为我的存储库(UserRepositoryCustomImpl)创建一个自定义实现,并自行构建查询。但是,我想知道是否没有“面向spring的解决方案”,比如一些注释,或者类似于我可以说,“嘿,使用这个Map,动态构建这个查询”的解决方案。
发布于 2016-07-25 16:35:51
我觉得我也经历过同样的情况:我的HTML表单有N个过滤器,但我希望它们只适用于被选中或更改的搜索。一旦您建模您的表单绑定了它各自的选择,输入等.在视图中,如果这些字段中的任何一个未被选中或具有默认值,则只想忽略这些字段,但仍然使用SpringRepository(在我的例子中是JpaRespository)的方便和方便。
使用我的小Spring透视图,我尝试使用规格说明方法(IMO比实现您的自定义存储库更好)。它工作得很完美,但不知道这是否是最好的方法。
这里是一个正式的Spring示例https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/
在这里,一个个人示例稍微简化了一点(并且可能打破了一些最佳编码实践,目的是可以理解):
MyObjectRepository.java
public interface MyObjectRepository extends JpaRepository<MyObject, Long>, JpaSpecificationExecutor<MyObject> { } MyObjectServiceImpl.java
@Service("MyObjectService")
public class MyObjectServiceImpl implements MyObjectService {
@Autowired
MyObjectRepository myObjectRespository;
@Override
public Page<MyObject> getAllMyObjectByFields(int pageIndex, FormMyObject formMyObject) {
Specification<MyObject> spec = new Specification<MyObject>() {
@Override
public Predicate toPredicate(Root<MyObject> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
if (formMyObject == null) {
throw new IllegalStateException("At least one parameter should be provided to construct complex query");
}
List<Predicate> predicates = new ArrayList<Predicate>();
// only if the content is present add a criteria to the search, you decide/know if will be null, or empty...
if (formMyObject.getYourField() != null && formMyObject.getYourField().length() > 0) {
predicates.add(
builder.and(builder.equal(root.get("field"), formMyObject.getYourField())));
}
// add as many criteria as you want/need
if(){
predicates.add( ... );
}
Predicate[] predicatesArray = new Predicate[predicates.size()];
return builder.and(predicates.toArray(predicatesArray));
}
};
PageRequest page = new PageRequest(pageIndex, formMyObject.getMaxResult());
// using the built in findAll method from Repository with dynamic custom filters
return myObjectRespository.findAll(spec, page);https://stackoverflow.com/questions/38566672
复制相似问题