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

标签 java spring spring-data-jpa querydsl

嗨,

在我的项目中,我有一个位字段标志(int),我需要使用多个条件查询数据库,其中之一是标志字段,在我的实体中我有一个字段标志,它是一个枚举,同一字段可以通过将多个值相互添加来保存多个值,然后使用 & 运算符提取我需要的结果。 例如:数据库中标志 = 4 + 128 = 132 我需要通过应用 AND 运算符来检查标志是否保持值 128,因此应用查询: 从 (flag & 128) > 0 的速率中选择 * 所以我需要的是使用 Querydsl 和 spring data jpa 发送 bitwise_AND。

我尝试使用 QuerydslBinderCustomizer,但找不到任何将按位运算符应用于整数的方法。 我还尝试创建一个自定义 BooleanExpression 以将其返回到手动应用按位运算符的绑定(bind).bind,但它也不起作用。

这是我需要的示例:

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;
            });

但是我遇到了无效的运算符 AND 错误。

这是怎么做到的?

谢谢。

最佳答案

首先你需要扩展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);
            });

关于java - 如何在 QueryDSL 中使用按位运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535741/

相关文章:

java - AWS Lambda 环境中 javac、jar 等二进制文件位于哪个路径?

java - MTLS 和 http 客户端连接池使用情况

java - Spring boot @Autowired 在单元测试用例中不起作用

java - 配置类 : ClassNotFoundException 的应用程序监听器时出错

java - 过滤掉 JPA 查询中的嵌套对象

java - JPA将某列的值加一

java - 在没有 XML 配置的情况下将 Ehcache CacheManager (v 3.x) 转换为 Spring CacheManager

java - 如何获取包含 tagName 的单元格中的值是 "td"或 "mat-cell"

javascript - Spring Controller URL 请求映射仅在带有字符串的空白页面上不起作用

java - 与连接表的一对多关系 : relation not being persisted