spring-data-jpa - 如何基于带引号的字符串值创建动态 QueryDSL 运算符

标签 spring-data-jpa querydsl

我有一个 pojo,其中包含属性名称、字符串形式的逻辑运算符和属性值。我想要完成的是从 pojo 数据动态创建谓词或表达式等。下面是我的代码:

public class QueryParam {
    private String property = "acctType";   //can be any property of classname
    private String operator = "eqic"        //can be any logic operator !=, >, <, >=, <= etc
    private Object value;                   //will store the value of 

    // getters/setters here
}

public interface CustomerRepository extends JpaRepository<Customer, Long>, QueryDslPredicateExecutor<Customer>{

}

@Service("CustomerService")
class MyCustomerServiceImpl {
    @Resource
    private CustomerRepository custRpstry;

    //if classname is Customer, property is "acctType", operator is "eqic", and value is "Corporate"
    //I want my findAll below to retrieve all Customers having acctType = "Corporate"
    List<Customer> findAll(List<QueryParam> qryParam) {
        QCustomer qcust = QCustomer.customer;

        BooleanBuilder where = new BooleanBuilder();
        for(QueryParam param : qryParam) {

            //within this block, i want a BooleanBuilder to resolve to:
            where.and(qcust.acctType.equalsIgnoreCase("Corporate"));

            something like:
            where.and(param.getClassname().param.getProperty().param.getOperator().param.getValue())
        }

        return custRpstry.findAll(where.getValue()).getContent();

    }
}

我无法弄清楚如何制定我的 BooleanBuilder 尤其是要转换的部分 getOperator() 转换为 .equalIgnoreCase()。

任何帮助将不胜感激。

提前致谢, 马里奥

最佳答案

在结合了 so 中一些相关问题的几个答案后,我能够制定一个适合我的解决方案。

BooleanBuilder where = new BooleanBuilder();
for(QueryParam param: qryParam) {
    //create: Expressions.predicate(Operator<Boolean> opr, StringPath sp, filter value)

    //create an Operator<Boolean>
    Operator<Boolean> opr = OperationUtils.getOperator(param.getOperator().getValue());

    //create a StringPath to a class' property
    Path<User> entityPath = Expressions.path(Customer.class, "customer");
    Path<String> propPath = Expressions.path(String.class, entityPath, param.getProperty());

    //create Predicate expression
    Predicate predicate = Expressions.predicate(opr, propPath, Expressions.constant(param.getValue()));
    where.and(predicate);
}

list = repository.findAll(where.getValue(), pageReq).getContent();  

我的OperationUtils.java

public class OperationUtils {

    public static com.mysema.query.types.Operator<Boolean> getOperator(String key) {
        Map<String, com.mysema.query.types.Operator<Boolean>> operators = ImmutableMap.<String, com.mysema.query.types.Operator<Boolean>>builder()
                  .put(Operator.EQ.getValue()   ,Ops.EQ)
                  .put(Operator.NE.getValue()   ,Ops.NE)
                  .put(Operator.GT.getValue()   ,Ops.GT)
                  .put(Operator.GTE.getValue()  ,Ops.GOE)
                  .put(Operator.LT.getValue()   ,Ops.LT)
                  .put(Operator.LTE.getValue()  ,Ops.LOE)
                  .build();

        return operators.get(key);
    }
}

关于spring-data-jpa - 如何基于带引号的字符串值创建动态 QueryDSL 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852945/

相关文章:

java - 是否可以使用原始 SQL 字符串创建 QueryDSL 谓词?

elasticsearch - Python Elasticsearch-DSL过滤器,用于值列表中的一个匹配项

java - 如何在 JPAQuery 中使用 INNER JOIN?

spring - DDD - 在 Spring Data 中维护单独的域类和实体类

java - Spring 数据 JPA : case insensitive orderBy

spring - jpa 不支持的操作异常 : query result offset is not supported

ibatis - 是否有任何类似于 MyBatis 中的 Criteria API 的功能,或者任何像 QueryDSL 这样的包装器来提供该功能?

java - 带有 LIKE 条件的 Spring Data JPA 查询在运行时抛出异常

java - 使用 mvn liquibase :diff? 时如何禁用删除表和列

java - 从 QueryDSL 中的选择中选择