【问题标题】:I have a Querydsl question. (Feat. BooleanBuilder)我有一个 Querydsl 问题。 (壮举。BooleanBuilder)
【发布时间】:2021-09-28 04:23:07
【问题描述】:
@Test
void testDepartment() throws Exception {

    String nameParam1 = "ComputerScience";
    String nameParam2 = "Department of Mathematics";
    String nameParam3 = "Department of Music";
    String nameParam4 = "Department of Language and Literature";
    String locParam = "null";

    List<Department> result = seacrhDepartment(nameParam1, nameParam2, nameParam3, nameParam4, locParam);
    assertThat(result.size()).isEqualTo(0);

}

private List<Department> seacrhDepartment(String nameParam1, String nameParam2, String nameParam3, String nameParam4, String locParam) {

    BooleanBuilder builder = new BooleanBuilder();

    if (nameParam1 != null) {
        builder.and(department.name.eq(nameParam1));
    }

    if (nameParam2 != null) {
        builder.and(department.name.eq(nameParam2));
    }

    if (nameParam3 != null) {
        builder.and(department.name.eq(nameParam3));
    }

    if (nameParam4 != null) {
        builder.and(department.name.eq(nameParam4));
    }

    if (locParam != null) {
        builder.and(department.name.eq(locParam));
    }

    return queryFactory
            .selectFrom(department)
            .where(builder)
            .fetch();
}





@BeforeEach
public void before() {
    queryFactory = new JPAQueryFactory(em);
    Department department1 = new Department("ComputerScience");
    Department department2 = new Department("Department of Mathematics");
    Department department3 = new Department("Department of Music");
    Department department4 = new Department("Department of Language and Literature");
    em.persist(department1);
    em.persist(department2);
    em.persist(department3);
    em.persist(department4);

}

我预先输入了数据.. 但是为什么这里必须传递 isEqual(0)..? 由于所有条件都设置为builder.and,设置为isEqualTo(5)不就通过了吗?

我应该使用什么测试来搜索单词 com 并获得计算机科学系?

【问题讨论】:

    标签: java tdd querydsl


    【解决方案1】:

    没有满足所有过滤器的Department。您可能想使用builder.or 而不是builder.and。

    【讨论】:

    • 感谢您的评论!但是,当我切换到builder.or org.opentest4j.AssertionFailedError:预期:5 但是:4 预期:5 实际:4 出现此错误消息。因此,如果我将其更改为 isEqualTo(4) ,它就会通过。查看查询 /* select department from Department department where department.name = ?1 or department.name = ?2 or department.name = ?3 or department.name = ?4 or department.name = ?5 */ 查询因为 locParam 没有输出。你知道为什么吗?
    • 您需要使用 isNull() 而不是 eq(“null”)。首先,SQL 中的 null 不能使用 = 进行比较:null = null 总是返回 false。正确的比较是“null is null”。其次,比较的表达式不是空表达式,而是包含文本“null”的字符串表达式。对于实际的空表达式,您需要 Querydsl 中的 Expressions.nullExpression()。
    • 即使我改成“String”,而不是“Null”,isEqualTo(4)也是一样的。
    • 有四个部门,查询结果明明有四个部门……
    • 糟糕.. 谢谢。我还有一个问题。当我在 asertThat 中搜索 %com% 时,我想做一些类似于 SQL 的 LIKE %com% 的事情。 containsOnly 或containsExactlyInAnyOrder我想是用这个。
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2016-07-12
    • 2020-12-01
    • 2016-10-31
    • 2015-06-24
    • 2015-05-23
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多