首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring扩展CrudRepository中的动态条件查询

Spring扩展CrudRepository中的动态条件查询
EN

Stack Overflow用户
提问于 2016-07-25 11:34:57
回答 1查看 2.7K关注 0票数 0

我有一个spring引导应用程序,我希望有一个动态查询条件,也就是说,我想要创建一个可以接收以下可选参数的方法:年龄和名称。我的问题是,这些参数是可选的,这意味着它们有时可以是空的,我想动态地构建我的查询,例如,如果参数不是空或空,我就把它们作为标准放在我的查询中,否则我就不会。

我为这个问题找到的解决方案基本上是为我的存储库(UserRepositoryCustomImpl)创建一个自定义实现,并自行构建查询。但是,我想知道是否没有“面向spring的解决方案”,比如一些注释,或者类似于我可以说,“嘿,使用这个Map,动态构建这个查询”的解决方案。

EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
    public interface MyObjectRepository extends JpaRepository<MyObject, Long>, JpaSpecificationExecutor<MyObject> { }           

MyObjectServiceImpl.java

代码语言:javascript
复制
@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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38566672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档