【问题标题】:Spring Data JPA QueryDSLSpring Data JPA QueryDSL
【发布时间】:2020-06-16 04:34:24
【问题描述】:

我正在尝试创建一个使用 Spring Data QueryDSL 的控制器。

我的控制器如下所示:

   @GetMapping("/playerAccount")
    public Iterable<PlayerAccount> getPlayerAccounts(com.querydsl.core.types.Predicate predicate) {
        return repository.findAll(predicate);
    }

我的实体是(为简洁起见)

@Entity
public class PlayerAccount {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
}

当我调用 GET /playerAccount API 时,我收到异常 IllegalStateException “No primary or default constructor found for interface com.querydsl.core.types.Predicate”(由 org.springframework.web.method.annotation.ModelAttributeMethodProcessor 抛出#createAttribute)。

可能出了什么问题?

谢谢

编辑:

我的 pom.xml 包含

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>

<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources</outputDirectory>
                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>

我没有@EnableSpringDataWebSupport,但我必须有一个等价物。

【问题讨论】:

  • 你能粘贴谓词模型的代码吗?谓词模型需要是DAO,并且需要有一个以@Id作为主键注释的字段。
  • 请看我的编辑。
  • 从日志中可以清楚地看到问题 - 您的谓词类没有默认构造函数。
  • 对不起,我不明白这意味着什么。我的谓词类是什么? Predicate 类不是我的,它来自 com.querydsl.core.types

标签: java spring rest spring-data-jpa querydsl


【解决方案1】:

在让它发挥作用之前,你必须记住一些事情。

  1. 为查询 dsl 支持指定以下依赖项
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>
  1. 为查询类生成添加 maven 插件(在你的情况下,com.fully.qualified.package.name.QPlayerAccount 将生成)
<plugin>
    <groupId>com.mysema.maven</groupId>
    <artifactId>apt-maven-plugin</artifactId>
    <version>1.1.3</version>
    <executions>
        <execution>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <outputDirectory>target/generated-sources</outputDirectory>
                <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>
  1. 通过在应用程序的主类中指定 @EnableSpringDataWebSupport 来启用 Spring 数据 Web 支持,以支持来自 Web 请求的 querydsl。

  2. Pradicate 提供元信息,以便随时随地进行填充

@GetMapping("/playerAccount")
public Iterable<PlayerAccount> getPlayerAccounts(@QuerydslPredicate(root = PlayerAccount.class) Predicate predicate) {
    return repository.findAll(predicate);
}

现在您可以提出使用查询 dsl 的请求了: GET /playerAccount 应该返回所有记录 在打电话给GET /playerAccount?name=Nick

[
    {
        id: 1,
        name: "Nick"
    }
]

希望这会有所帮助!

【讨论】:

  • 我会仔细检查,但我已经拥有了所有这些。如果缺少哪个部分,会导致我得到的异常?
  • @BobJI 很可能来自控制器的捕获谓词的方法中的@QuerydslPredicate(root = PlayerAccount.class) Predicate predicate
  • 我已经添加了,但问题仍然存在。
  • 您在启动应用程序之前是否解雇了mvn clean install,因为它会在编译期间生成 java 类?
  • 是的,我做到了。我刚刚注意到一些奇怪的事情,这与抛出的错误“No primary or default constructor found for interface com.querydsl.core.types.Predicate”有关:生成的对象 QPlayerAccount 确实缺少无参数构造函数。这是预期的吗?
猜你喜欢
  • 2012-11-09
  • 2016-02-17
  • 2014-03-29
  • 2020-08-18
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2020-01-12
  • 2011-12-25
相关资源
最近更新 更多