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

Java 如何在QueryDSL中使用位运算符?,java,spring,spring-data-jpa,querydsl,Java,Spring,Spring Data Jpa,Querydsl,嗨 在我的项目中,我有一个位field flag int,我需要使用几个条件查询数据库,其中一个是flag字段,在我的实体中,我有一个字段flag,它是一个枚举,同一个字段可以通过相互添加多个值来保存多个值,然后使用&operator提取我需要的结果。 例如:在数据库中标志=4+128=132 我需要通过应用AND运算符检查标志是否包含128的值,因此应用查询: 从标记为&128>0的速率中选择* 所以我需要的是发送一个按位_,并使用Querydsl和spring数据jpa 我尝试使用Query

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

我尝试使用QuerydslBinderCustomizer,但找不到任何对整数应用任何逐位运算符的方法。 我还尝试创建一个自定义布尔表达式,将其返回到bindings.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;
            });
但我得到了一个无效的运算符和错误

这怎么可能呢


谢谢。

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