QueryDsql构建一个没有booleanbuilder的查询

时间:2015-04-17 10:48:07

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

我有一个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);
}

如果工作正常,除非“某事”是假的。 当它为真时,booleanbuilder创建一个子查询,检查2个表中的所有行,需要2分钟。 我写了自己的sql,它假装了一秒钟。所以我的问题是如何实现我的SQL到HQL / DSL Querty /等。所以,如果检查我的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等对象进行对比。

2 个答案:

答案 0 :(得分:0)

通过调用where:

,可以将BooleanBuilder实例用作查询的谓词
query.where(bb);

答案 1 :(得分:0)

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