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

在QueryDSL和spring data JPA中使用动态筛选映射创建查询

蒋茂
2023-03-14

我在我的应用程序中使用Spring数据和JPA,并且我正在尝试实现QueryDSL for dynamic criteria API。如果我在条件中发送特定值,使用以下谓词可以很好地工作:

Predicate predicate = QProductInfo.productInfo.shopName.eq(shopName).and(QProductInfo.productInfo.productType.eq(productType));

但是,如果我接收到多个筛选器参数,并希望使用映射存储键值对(column_name-column_value)以动态派生查询,则无法为相同的参数创建查询。意思是我知道我可以在谓词中使用and或ORT运算符添加尽可能多的条件,但是我需要使用多少表达式只是在运行时决定的,所以无法找到形成正确表达式的方法。

@Entity
Public class ProductInfo{
productId;
title;
vendor;
code;
.... and more
}

现在筛选器可以从1到n个字段变化,其值如筛选器1=PRODUCT_ID=123,title=Test filter 2=title=xyz,CODE=abc,Vendor=PQR

因此,我将使用map存储键值对(title-xyz等),并希望动态地构造查询。

我读了很多教程,但到目前为止还没有找到适合我的条件的解决方案。在迭代map循环时,我也想过使用Switch,但如何使用所有表达式/谓词,我还不知道。

如果我没有找到解决方案,我可能会使用JPA标准API,在那里我们可以很容易地使用谓词列表。让我知道如果有任何信息需要帮助我这里。

谢谢

共有1个答案

农鸿达
2023-03-14

我可以通过以下步骤来解决我的问题:我使用了BooleanBuilder和PathBuilder。

下面是代码片段:

BooleanBuilder builder = new BooleanBuilder();
PathBuilder<ProductInfo> path = new PathBuilder<>(ProductInfo.class, "productInfo");
    if(criteriaMap != null && !criteriaMap.isEmpty()) {
        for (Map.Entry<String, String> entry : criteriaMap.entrySet()) {
            builder.and(path.getString(entry.getKey()).eq(entry.getValue()));    
        }
    }

这里,builder manage从Map(Map以键值对的形式给出列名和值)中添加条目,PathBuilder用于将列名设置为参数。

谢谢

 类似资料:
  • 我得到了以下数据结构 我正在寻找一个查询dsl谓词,它给我的所有出版物,其中任何Author.name包含某个字符串,例如“汉斯” 我试过了: 但是,如果有多个作者在名称中包含“Hans”,则这是抱怨。有没有像出版一样就像一个集合?

  • 问题内容: 我对使用关系数据库还很陌生,所以我更喜欢使用一个好的ORM来简化事情。我花时间评估了不同的Python ORM,我认为我需要SQLAlchemy。但是,我已经陷入了精神上的死胡同。 我需要创建一个新表,以与在应用程序的播放器表中创建的播放器的每个实例一起使用。我想我知道如何通过元数据更改表的名称然后调用create函数来创建表,但是我不知道如何将其映射到新的动态类。 有人可以给我一些提

  • 问题内容: 我正在开发Web应用程序。我们在项目中将Hibernate用作ORM。实际上,我们的应用程序根据用户选择动态创建一些表。用户可以选择表名,列名,然后可以从csv文件导入数据。所以我的问题是:如何用Hibernate和Java对象映射此动态创建的表? 问题答案: 它可以动态完成,但有些混乱: 在建立SessionFactory之前,您需要动态更改Hibernate的Configurati

  • 我试图在map()中使用filter(),但我得到了这个火花异常: RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1。地图(x)= 我知道火花不允许嵌套转换/动作/RDD,所以有人可以给我一个建议,如何替代它(没有嵌套转换或动作),我有一个RDD它的元组是这样的: 我试着映射它,给它一个列表作为参数,这个列表包含javaPairRDD这样的: 这些行指的是修改RDD()函

  • 如何过滤