spring - 在查询 DSL 中返回页面<Object>

标签 spring querydsl

我正在使用查询 DSL,并希望我的结果集返回页面对象。有没有办法在 Query DSL 中做到这一点?如果是这样,我的查询会是什么样子? 我正在使用 JPAQuery 并且我有我的 QClasses

方法结构是这样的

public Page<Object> searchPerson(String name,String phone){
 Page<Object> results=null;
 JPQLQuery query = new JPAQuery(entityManager);
 QPerson person = QPerson.person;
   //I am assuming my query would go here 
  results = query.from(person). ?????  


return results;} 

救命啊!

最佳答案

这是我使用 QueryDSL 实现的PagingPageRequest 定义查询的参数(限制和页面):

public class PageRequest {
    protected Long page = 1l;// 1 is the first page
    protected Integer limit = 10;

    public PageRequest(Long page, Integer limit) {
        this.limit = limit;
        this.page = page;   
    }

    public Long getPage() {
        return page;
    }

    public Integer getLimit() {
        return limit;
    }

    public Long getOffset() {
        return (page - 1l) * limit;
    }
}

Page 类包含查询的结果(此处为属性 objects),并且可以实现创建漂亮的分页链接的方法。

public class Page<T> extends PageRequest {

    protected Collection<T> objects;
    private Long totalCount;
    private Long pageCount;
    private Boolean hasPageLinkPrev;
    private Boolean hasPageLinkNext;
    private Collection<Long> pageLinks;

    public Page(Long page, Integer limit, Long totalCount, Collection<T> objects) {

        this.page = page;
        this.limit = limit;
        this.totalCount = totalCount;
        this.objects = objects;

        this.pageCount = totalCount / limit;
        if (totalCount % limit > 0) {
            this.pageCount = this.pageCount + 1;
        }

        this.hasPageLinkPrev = page > 1;
        this.hasPageLinkNext = page < this.pageCount;

        this.pageLinks = new ArrayList<>();
        if (this.pageCount != 1) {
            this.pageLinks.add(1l);
            if (page > 3l) {
                this.pageLinks.add(-1l);
            }
            if (page > 2l) {
                if (page.equals(this.pageCount) && this.pageCount > 3l) {
                    this.pageLinks.add(page - 2l);
                }
                this.pageLinks.add(page - 1l);
            }
            if (page != 1l && !page.equals(this.pageCount)) {
                this.pageLinks.add(page);
            }
            if (page < this.pageCount - 1l) {
                this.pageLinks.add(page + 1l);

                if (page == 1l && this.pageCount > 3l) {
                    this.pageLinks.add(page + 2l);
                }
            }
            if (page < this.pageCount - 2l) {
                this.pageLinks.add(-1l);
            }
            this.pageLinks.add(this.pageCount);
        }
    }

    public Page(PageRequest pageRequest, Long totalCount, Collection<T> objects) {
        this(pageRequest.getPage(), pageRequest.getLimit(), totalCount, objects);
    }

    public Long getTotalCount() {
        return this.totalCount;
    }

    public Long getPageCount() {
        return this.pageCount;
    }

    public Long getPage() {
        return this.page;
    }

    public Integer getLimit() {
        return this.limit;
    }

    public Boolean getHasPageLinkPrev() {
        return this.hasPageLinkPrev;
    }

    public Boolean getHasPageLinkNext() {
        return hasPageLinkNext;
    }

    public Collection<Long> getPageLinks() {
        return pageLinks;
    }

    public Collection<T> getObjects() {
        return objects;
    }
}

有了这些东西,创建查询并将结果放入我们的页面对象中并不困难。一种可能性是在存储库类的基类中编写通用方法:

    protected <T> Page<T> getPage(JPQLQuery<T> query, PageRequest pageRequest) {

        List<T> resultList = query
            .offset(pageRequest.getOffset())
            .limit(pageRequest.getLimit())
            .fetch();

        Long totalCount = query.fetchCount();
        return new Page<T>(pageRequest, totalCount, resultList);
    }

在存储库类中,您可以为特定用例创建查询。然后您可以使用方法getPage来获取Page中的结果。

public Page<Person> searchPerson(String name,
                                 String phone,
                                 PageRequest request){
  Page<Person> results=null;
  JPQLQuery<Person> query = new JPAQuery<>(entityManager);
  QPerson person = QPerson.person;
  query = query.from(person)
     .where(person.name.eq(name)
         .and(person.phone.eq(phone)));
  return getPage(query, request);
} 

关于spring - 在查询 DSL 中返回页面<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36018310/

相关文章:

spring - Spring Boot 中解析 graphql schema 时出错,如何修复?

spring - 上下文初始化失败或加载属性

java - Spring Jaxb2RootElementHttpMessageConverter 不使用 jaxb 注释

java - QueryDSL 动态谓词链

maven - 如何从jar依赖项引用JPA注释的类来生成QueryDsl Q类?

java - JPAQuery 与 Spring Pageable

java - Hibernate:在 HQL/QueryDSL 中使用单个 join 语句初始化所有子项?

spring - 在我的 JUnit 测试中,如何验证 Spring RedirectView?

java - 如何更改Spring Security中SAML请求的签名算法

java - Querydsl需要查询整数列小于值的地方