当前位置: 首页 > 知识库问答 >
问题:

如何在QueryDSL中使用按位运算符?

贡烨烁
2023-03-14

嗨,

public interface RateRepository extends CrudRepository<Rate,RatePK>, QueryDslPredicateExecutor<Rate>, QuerydslBinderCustomizer<QRate> {

@Override
default void customize(QuerydslBindings bindings, QRate qRate) {
    bindings.bind(qRate.rateId).first(
            (path, value) -> {
                return (path & value > 0) //Something like this, or a function like:
                //return (bitwise_AND(path, value) > 0);
            });
}

我还尝试使用com.querydsl.core.types.dsl.expressions和com.querydsl.core.types.predicate,如下所示:

bindings.bind(qRate.rateFlag).first(
            (path, value) -> {
                Expression<Integer> intPath = Expressions.asNumber(path);
                Expression<Integer> rateFlag = Expressions.asNumber(value);
                Expression<Integer> zeroValue = Expressions.asNumber(0);
                Expression<Integer> integerExpression = Expressions.numberOperation(Integer.class, Ops.AND, intPath, rateFlag);
                Predicate predicate  = Expressions.predicate(Ops.GT, integerExpression, zeroValue);
                return predicate;
            });

但我得到了一个无效的运算符和错误。

怎么会这样呢?

共有1个答案

江浩慨
2023-03-14

首先,您需要扩展hibernate方言以支持位操作,如下所示

public class MySQLDialect extends org.hibernate.dialect.MySQLDialect {

    public MySQLDialect() {
        super();
        registerFunction("bitand", new SQLFunctionTemplate(IntegerType.INSTANCE, "(?1 & ?2)"));
    }
}

然后可以从querydsl或spring存储库中引用此函数

bindings.bind(qRate.rateFlag).first(
            (path, value) -> {
                Expression<Integer> zeroValue = Expressions.asNumber(0);
                NumberTemplate<Integer> numberTemplate = Expressions.numberTemplate(Integer.class, "function('bitand', {0}, {1})", path, value);
                return numberTemplate.gt(0);
            });
 类似资料:
  • 问题内容: 为了测试使用更基本的构建块(在我的情况下使用Nand,Or和And)构建Xor操作,我需要能够执行Not操作。内置似乎只用一位完成此操作。如果我做: 我应该得到,但是我只是得到。我究竟做错了什么?还是Python只是缺少此基本功能? 我知道Python具有内置的Xor函数,但我一直在使用Python来测试需要构建Xor门的HDL项目/课程的内容。我想在Python中进行测试,但是我不能

  • 问题内容: 请考虑这个例子 位运算符和运算符如何处理布尔变量? 问题答案: Java 中没有按位操作。 并且不在Java中执行按位运算,而是在逻辑运算中进行操作(如 JLS的 §15.22.2中所指定) 。 是逻辑AND(如果且仅当两个参数都为时,它将求和) 是逻辑“或”(如果且仅当至少一个参数为时,它将求和)。 请注意, 同一 运营商用于位运算,但这些只有在两个操作数都是一个类型,可转换为一个整

  • 问题内容: 我很惊讶在Google上找不到这个简单的发音问题的答案。在检查了十几个不同的页面之后,我只想在这里询问… 根据此页面,3&5导致1。5等于7。我唯一的问题就是: 我们如何获得3和5中的1? 如何获得3分7分| 5? 另外,负数呢? 8和-8如何得出8? 果然,用Java编写以下代码: 产生以下输出: 但是同样,如何确定/计算这些结果? 问题答案: 3&5: 3 | 5: Java中的否

  • 考虑以下代码: 我可以理解Python(和其他语言)中的算术运算符,但我从来没有很好地理解过“按位”运算符。在上面的示例中(来自Python书籍),我理解左移位,但不理解其他两个。 此外,位运算符实际用于什么?我想举一些例子。

  • 问题内容: 为什么按位操作打印-1?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统

  • 问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。