如果函数的参数为​​空,则排除查询条件

时间:2017-07-24 09:37:15

标签: hibernate jpa criteria-api

如果cb.equal(myClass.get(MyClass_.token), token)为空且没有重复查询,是否可以忽略token?如果完全复制查询(只跳过一个条件),我不想把它打包成巨大的。

private MyClass find(String code, String token) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<MyClass> cq = cb.createQuery(MyClass.class);
    Root<MyClass> myClass = cq.from(MyClass.class);
    cq.select(myClass).where(
            cb.and(cb.equal(myClass.get(MyClass_.code), code),
                    cb.equal(myClass.get(MyClass_.token), token),
                    cb.greaterThan(myClass.get(MyClass_.expirationDate), DateUtils.getTime())
            ));
    ....
}

1 个答案:

答案 0 :(得分:1)

做下面的事情。注意我只是文本编辑你的代码,并没有实际检查语法错误或编译它

private MyClass find(String code, String token) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<MyClass> cq = cb.createQuery(MyClass.class);
    Root<MyClass> myClass = cq.from(MyClass.class);
    Predicate predicate = cb.and(
            cb.equal(myClass.get(MyClass_.code), code),
            cb.greaterThan(myClass.get(MyClass_.expirationDate), DateUtils.getTime())
    );
    if (token != null)
        predicate = cb.and(predicate, cb.equal(myClass.get(MyClass_.token), token));

    cq.select(myClass).where(predicate);
}