【问题标题】:Spring JPA Query BugSpring JPA 查询错误
【发布时间】:2022-12-11 10:15:20
【问题描述】:

我有一个非常奇怪的错误。

我在数据库中存储了一些输入数据:

Map<String, Object> params = new HashMap<>();
params.put("all", all);
params.put("pageable", pageable);

myObj.setInputData(params);

...
then repo.save(myObj);

但是当我查询findByTestId时,我得到了这个错误:

java.lang.NoSuchMethodException: org.springframework.data.domain.Sort$Order.() 在 java.base/java.lang.Class.getConstructor0(Class.java:3349) 在 java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553) 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:146)

这是我的回购:

 public interface DataRepository extends MongoRepository<Data, String> {

   Optional<Data> findByTestId(String testid);

 }

如果我从 inputData 中删除可分页,它又可以正常工作了。为什么在查询中使用了我的 HashMap?我该如何解决?

我只想再次获取 inputData,以便在查询中使用它。

编辑:我也尝试使用一个对象而不是哈希图,但我遇到了同样的问题

【问题讨论】:

  • 请显示存储库中使用的Data
  • @MarcStroebel Data 类有一个名为 inputData 的属性,即 Map<String, Object>。没什么特别的

标签: java


【解决方案1】:

看起来您的地图中的可分页参数导致了问题。这可能是因为 pageable 参数是 org.springframework.data.domain.Sort$Order 的实例,它没有默认构造函数。当您尝试将包含此对象的 Map 保存到数据库时,Spring Data 在从数据库中检索对象时无法实例化该对象,从而导致您看到的 NoSuchMethodException。

此问题的一种解决方案是创建一个自定义类来表示您要存储在 Map 中的数据,并在您的代码中使用此类的实例而不是 Map。这个自定义类应该包括所有你想要存储的数据,包括 pageable 参数,并且应该有一个默认的构造函数,当它从数据库中检索时可以用来实例化这个类。

以下是您如何实施此解决方案的示例:

public class MyData {
    private boolean all;
    private org.springframework.data.domain.Sort$Order pageable;

    public MyData() {}

    public MyData(boolean all, org.springframework.data.domain.Sort$Order pageable) {
        this.all = all;
        this.pageable = pageable;
    }

    // getters and setters
}

然后,您可以按如下方式使用此类:

MyData myData = new MyData(all, pageable);
myObj.setInputData(myData);
repo.save(myObj);

当您从数据库中检索数据时,您可以简单地将 inputData 属性转换为 MyData 的实例并直接访问 all 和 pageable 参数。

Optional<Data> result = repo.findByTestId(testid);
if (result.isPresent()) {
    MyData inputData = (MyData) result.get().getInputData();
    // use inputData.getAll() and inputData.getPageable() as needed
}

我希望这有帮助!如果您有任何其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 2019-10-27
    • 1970-01-01
    • 2018-02-23
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多