Java 如何在QueryDSL中使用位运算符?
嗨 在我的项目中,我有一个位field flag int,我需要使用几个条件查询数据库,其中一个是flag字段,在我的实体中,我有一个字段flag,它是一个枚举,同一个字段可以通过相互添加多个值来保存多个值,然后使用&operator提取我需要的结果。 例如:在数据库中标志=4+128=132 我需要通过应用AND运算符检查标志是否包含128的值,因此应用查询: 从标记为&128>0的速率中选择* 所以我需要的是发送一个按位_,并使用Querydsl和spring数据jpa 我尝试使用QuerydslBinderCustomizer,但找不到任何对整数应用任何逐位运算符的方法。 我还尝试创建一个自定义布尔表达式,将其返回到bindings.bind,手动应用逐位运算符,但也不起作用 这是我需要的一个例子: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
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);
});