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

Spring@querydslpredicate问题

马银龙
2023-03-14

Spring Boot1.3.2.释放

QueryDSL 3.7.2

因此,我的实体是这样设置的:

person.java

@Data
@Entity
@Audited
public class Person {

    @Id
    private long id;

    private String name;

    private List<Pet> pets = new ArrayList<>();

}

Pet.java

@Data
@Entity
@Audited
public class Pet {

    @Id
    private long id;

    private int age;

}
public final ListPath<com.test.Pet, com.test.QPet> pets = this.<com.test.Pet, com.test.QPet>createList("pets", com.test.Pet.class, com.test.QPet.class, PathInits.DIRECT2);
10:21:37,523 ERROR [org.springframework.boot.context.web.ErrorPageFilter] (http-/127.0.0.1:8080-1) Forwarding to error page from request [/list] due to exception [null]: java.lang.NullPointerException
    at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:143) [spring-core-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:185) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.reifyPath(QuerydslPredicateBuilder.java:188) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPath(QuerydslPredicateBuilder.java:167) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.invokeBinding(QuerydslPredicateBuilder.java:136) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPredicate(QuerydslPredicateBuilder.java:111) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.web.querydsl.QuerydslPredicateArgumentResolver.resolveArgument(QuerydslPredicateArgumentResolver.java:106) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.data.web.querydsl.QuerydslPredicateArgumentResolver.resolveArgument(QuerydslPredicateArgumentResolver.java:48) [spring-data-commons-1.11.2.RELEASE.jar:]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) [spring-web-4.2.4.RELEASE.jar:4.2.4.RELEASE]
Field field = ReflectionUtils.findField(entityPath.getClass(), path.getSegment());
Object value = ReflectionUtils.getField(field, entityPath);

http://localhost:8080/test-app/list?name=bob

我的预期是,通过使用?pets.age=5,将构建以下谓词:

QPerson.person.pets.any().age.eq(5)

在Spring的QuerydslPredicate支持下,这是可能的吗?还是应该从查询参数手动构建谓词?

final BooleanBuilder petBuilder = new BooleanBuilder();
petBuilder.and(QPet.firstName.equals("Bob").or(QPet.lastName.equals("Bob")));

如果这些都不可能,那么我将继续手动创建谓词,并将其传递到存储库。

共有1个答案

金子平
2023-03-14

您可以使用QueryDSLBinderCustomizer来实现您的目的。以下是一些可以帮助您解决问题的示例代码:

public interface PersonRepository extends JpaRepository<Job, Integer>,
        QueryDslPredicateExecutor<Person>, QuerydslBinderCustomizer<QJob> {

    @Override
    public default void customize(final QuerydslBindings bindings, final QPerson person)     {
        bindings.bind(person.pets.any().name).first((path, value) -> {
            return path.eq(value);
        });
    }
}
 类似资料:
  • 当我尝试使用以下URL调用endpoint时: 将引发此异常: 只使用ZonedDateTime对象解析给定的日期是可行的(在Ideone.com上),但是其他的可能是错误的。我在SO上发现了这个问题:使用Spring@RestController处理带有ZonedDateTime参数的HTTP GET 明显的区别是在RequestParam中添加了。现在我在想;我如何让它与QueryDSLPre

  • 我使用Spring Boot和使用Spring Cloud APIGW的微服务堆栈。我使用这里提到的相同代码:https://piotrminkowski.com/2020/02/20/microservices-api-documentation-with-springdoc-openapi/ 当我到达任何一个endpoint时,我都看不到响应正在到来并低于错误。 CORS 策略已阻止从源“ht

  • 我使用的是Spring Security 3.1.3。在我的maven pom中发布,因为我正在阅读的书是2013年的,他们使用了这本书,并有以下代码片段: //管理员控制器 //登录控制器 //web。xml //Spring Security配置:: 应用程序Context-security.xml //登录名。jsp 当我启动我的应用程序时,我会得到带有表单的登录页面。我分别输入admin/

  • 我正在尝试将Spring Security性与LDAP集成。使用spring core版本4.0.5,spring security版本3.2.2和spring ldap版本1.3.2。这是我的安全配置xml

  • 我在springboot项目1.5.10版中工作。释放 我正在为sftp使用Spring集成。以下gradle依赖项对我来说一切都很好 我还将普罗米修斯整合到模块中。 我已经完成了普罗米修斯的所有其他要求。但是我没有得到普罗米修斯的指标。 项目中的所有其他服务都在使用prometheus,但没有使用spring integration sftp,prometheus正在为所有这些服务工作。 我尝试

  • 原因: 它抱怨在我的@Configuration类中找不到一个非空的构造函数,但这些构造函数在Spring的最新版本中是支持的。如果我移除依赖关系,应用程序就会正常启动。如何在不重新配置我的类的情况下修复此问题?等待更新版本的云AWS?