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

querydsl-jpa动态查询

闻鹤龄
2023-03-14

假设我有一个生成的实体,如下所示:

public class QCandidate extends EntityPathBase<Candidate> {

public final com.avisto.candisearch.persistance.model.enums.QAvailabilityEnum availability;

public final DatePath<java.util.Date> birthDate = createDate("birthDate", java.util.Date.class);

public final NumberPath<Long> cvId= createNumber("cvId", Long.class);

public final StringPath city = createString("city");

}

我的输入值是字段名称(“可用性”、“生日”、“CVID”...)和一个字符串值,我应该使用它对所有字段执行“like”。

我想从以下字段名开始构建一个查询:

    null
lower(cast(C.cvId as varchar(255))) like 'value'

我试图使用PathBuilder,但似乎要使用“getString或getBoolean”之类的方法,就必须知道要提取的字段的类型。在我的例子中,由于我只是从字段名开始,所以我不能使用这些方法,也不知道如何从字段名开始识别每个字段的类型,所以我被困住了。

共有1个答案

史飞尘
2023-03-14

可能有点难看,但可行的建议。

请注意,PathBuilder接受的字段类型的数量非常有限。

您肯定可以从field name中找到field类(使用反射或通过维护与每个字段一起更新的成员映射)。

//building query
for each field
  Class fieldClass = findFieldClas(.., field) //use reflection or map
  PathHandler handler = handlers.get(fieldClass)
  handler.process( ...)

//type handler interface
public interface Handler{
  public xx process(? extends DataPathBase);
}

//specific type handler implementation
public class BooleanHandler implements Handler{
  public xx process(? extends DataPathBase path){
    BooleanPath bPath = (BooleanPath)path;
    ...
}

//intitialize handlers map singleton or a factory in advance    
handlers.put(BooleanPath.class, new BooleanHandler());
...
 类似资料:
  • 我在使用与Spring Data JPA集成的QueryDSL时遇到了一个奇怪的行为: 我在Project和Person之间有ManyToOne关系。如果我通过所有者ID(外键)获取属于用户的所有项目,一切都按预期工作: 生成的查询: 但是,假设我们想通过一个不是外键的字段(例如所有者的姓名)获取属于一个人的所有项目: 在这些情况下,表Person被不必要地连接了两次(请注意person1_和pe

  • 我在我的应用程序中使用Spring数据和JPA,并且我正在尝试实现QueryDSL for dynamic criteria API。如果我在条件中发送特定值,使用以下谓词可以很好地工作: 但是,如果我接收到多个筛选器参数,并希望使用映射存储键值对(column_name-column_value)以动态派生查询,则无法为相同的参数创建查询。意思是我知道我可以在谓词中使用and或ORT运算符添加尽

  • 现在我扪心自问,是不是有什么“点符号”或者其他什么东西让这个案例变得可有可无。在E。例如:本机SQL我会做一些事情,比如创建一个子查询,并从内部投影中选择所有别名值()。 如果有任何建议,我将不胜感激。

  • 问题内容: 我正在寻找一种使用Spring Data JPA动态构建查询的解决方案。我有一个GameController,它有一个RESTful服务终结点/ games,它带有4个可选参数:体裁,平台,年份,标题。可能不传递任何API,而是传递所有4种,以及之间的每种组合。如果未传递任何参数,则默认为null。我需要在存储库中使用一种方法来构建适当的查询,并且理想情况下还允许Spring Data

  • 目前我一直在使用以下Spring JPA存储库自定义查询, 我需要修改这个查询时,筛选文本将是逗号分隔的值。但按照以下方式,它将是一个动态查询,我如何执行它。 我需要构建动态查询,