spring 使用queryDSL按属性名称获取动态属性 predicate

nwo49xxi  于 2022-10-30  发布在  Spring
关注(0)|答案(3)|浏览(322)

我使用Query DSL生成实体EntitySerializer以便使用QueryDSL查询JPA实体(与SpringData集成)。
我从客户端接收属性名称,并希望为这些属性创建 predicate ,这些 predicate 可以添加(AND)到其他 predicate 中。
我不知道如何从EntitySerializer获取与我的属性名称匹配的 predicate /路径。例如,假设我们有一个Person实体(带有自动生成的QPerson类),该实体带有一个“name”属性,我希望根据该属性进行筛选(最后,我希望创建一个泛型方法)。以下是泛型方法:

Public Predicat getPredicatByPropertyName(String propertyName)  {
      QPerson p = QPerson.person;
      person.getPredicat(“propertyName”).like(“tom”);
}
w8f9ii69

w8f9ii691#

要创建字符串类型的属性,只需使用以下代码段

new StringPath(p, propertyName)

然后可以像这样使用它来创建 predicate 示例

new StringPath(p, propertyName).like("tom")
2skhul33

2skhul332#

我这样做略有不同,因为正如蒂莫说,没有工作直截了当,这里是:

query.from(play);
query.where( Expressions.stringPath(play, "name").eq("New play") );

我知道,也可以通过单独执行以下操作来实现:

StringPath column = Expressions.stringPath(play, "name");

query.from(play);
query.where( column.eq("New play") );
3qpi33ja

3qpi33ja3#

在QueryDSL 5.0中,我发现了两种独立于列类的方法:

第一种方式:仅使用反射

Field pathField = p.getClass().getField(reportField.getFieldName());
ComparableExpressionBase<?> path = (ComparableExpressionBase<?>)
pathField.get(p);

注意:我使用 ComparableExpressionBase 类是因为它由我找到的所有“路径类”扩展,并且它还可以在select、orderBy和其他函数中用于构建查询

第二种方式:使用反射和ExpressionUtils

Class<?> pParameterClass = (Class<?>) ((ParameterizedType) p.getClass().getGenericSuperclass())
            .getActualTypeArguments()[0];
Class<?> pathClass = pParameterClass.getDeclaredField(pathName).getDeclaringClass();
Path<?> path = ExpressionUtils.path(pathClass, p, pathName);

注意:用这种方法我们首先得到表see this answer for an explanation on how to get a parametrized type的实体的类,然后得到路径的类,最后用ExpressionUtils.path方法得到路径。

相关问题