【问题标题】:QueryDsql build a query with no booleanbuilderQueryDsql 构建一个没有 booleanbuilder 的查询
【发布时间】:2015-06-24 04:22:41
【问题描述】:

我有一个 queryDsl booleanbuilder 查询,因为我的代码中有很多 if:

 private Page<QA> query(Pageable pageable, QAFilter filter) {

    QA qa = QA.a;
    BooleanBuilder bb = new BooleanBuilder();


    if (StringUtils.qaNotBlank(filter.getParam())) {
        bb.and(likePredicate(qa.param, filter.getCode()));
    }

    if (StringUtils.qaNotBlank(filter.get2param())) {
        bb.and(qa.locationCode.eq(filter.2param()));
    }

    if (sth == true) {
        bb.or(qa.joinedObject.any().field.eq(filter.param));
    }

    return repo.findAll(bb.getValue(), pageable);
}

除非“某事”为假,否则如果工作正常。 当它为真时,布尔构建器会创建一个子查询来检查 2 个表中的所有行,这需要 2 分钟。 我写了我自己的 sql,它假装了一秒钟。所以我的问题是如何将我的 sql 实现到 HQL/DSL Querty/等。这样 if 检查我的 if 并将参数添加到查询中。 喜欢:

 private Page<QA> query(Pageable pageable, QAFilter filter) {

    QA qa = QA.a;
    JPAQuery query = new JPAQuesry();
    query.leftjoin(myobiects);

    if (StringUtils.qaNotBlank(filter.getParam())) {
        query.where(likePredicate(qa.param, filter.getCode()));
    }

    if (StringUtils.qaNotBlank(filter.get2param())) {
        query.where(qa.locationCode.eq(filter.2param()));
    }

    if (sth == true) {
        query.where(qa.joinedObject.any().field.eq(filter.param));
    }

    return repo.findInDB(query, pageable);
}

现在如何用 OR、AND 等连接对象。

【问题讨论】:

    标签: hibernate jpa spring-data-jpa hql querydsl


    【解决方案1】:

    BooleanBuilder 实例可以通过调用 where 来作为查询的谓词:

    query.where(bb);
    

    【讨论】:

      【解决方案2】:

      问题是关于如何加快查询速度。我想知道如何更改代码等,但最后我决定在外键上创建一个索引(JoinedObjectTable.ForeignKeyToQA - 因为query.where(qa.joinedObject.any() 创建了一个子查询)。因此该指数将速度从 2 分钟提高到大约 0.05 sek。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-28
        • 2018-07-06
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        相关资源
        最近更新 更多